daybreaksnow's diary

私を私と呼びたい

[Java]Eclipseで実行可能JARファイルでエクスポートした時のディレクトリ構成の違い

エクスポートするプロジェクトのディレクトリ構成

SpringSample
  src
    spring
      sample
        SpringSample.java
  conf
    spring-conf.xml
  lib
    spring.jar
    commons-logging.jar

1.生成されるJARに必須ライブラリーを抽出

SpringSample.jar
  META-INF
    MANIFEST.MF
    LICENSE(commons-loggingのMETA-INFの中身)
    spring.tld(spring.jarのMETA-INFの中身)
  org
    springframework
    ...(spring.jarの中身が展開されている)
  spring
    sample
      SpringSample.java
  spring-conf.xml
MANIFEST.MFの中身
Manifest-Version: 1.0
Class-Path: .
Main-Class: spring.sample.SpringSample

2.生成されるJARに必須ライブラリーをパッケージ

SpringSample.jar
  META-INF
    MANIFEST.MF
  org
    eclipse/jdt/internal/jarinjarloader
      JarRsrcLoader.class
      ...
  spring
    sample
      SpringSample.java
  commons-logging.jar
  spring.jar
  spring-conf.xml
MANIFEST.MFの中身
Manifest-Version: 1.0
Rsrc-Class-Path: ./ spring.jar commons-logging.jar
Class-Path: .
Rsrc-Main-Class: spring.sample.SpringSample
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

3.生成されるJARの隣のサブフォルダーに必須ライブラリーをコピー

SpringSample.jar
  META-INF
    MANIFEST.MF
  spring
    sample
      SpringSample.java
  spring-conf.xml
SpringSample_lib
  commons-logging.jar
  spring.jar
MANIFEST.MFの中身
Manifest-Version: 1.0
Class-Path: . springSample_lib/spring.jar springSample_lib/commons-logging.jar
Main-Class: spring.sample.SpringSample

構成の違いのまとめ

・生成されるJARに必須ライブラリーを抽出
 依存するjarの中身を全て展開する。そのため、クラスパスはカレントのみ

・生成されるJARに必須ライブラリーをパッケージ
 jar内のルートディレクトリに依存するjarをコピー、指定したMainクラスではなく、JarRsrcLoaderが実行される。

・生成されるJARの隣のサブフォルダーに必須ライブラリーをコピー
 依存するjarの中身は「プロジェクト名_lib」にコピーされ、クラスパスはそちらを参照する