[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」にコピーされ、クラスパスはそちらを参照する