31724


同じ構造を持つjarライブラリがあります。  
それぞれのjarライブラリはデバッグ接続用、リリース接続用のような感じで  
**jarを切り替えるだけでそれら処理が切り替わるように内部には同じパッケージで同じクラスが存在** します。

eclipseのプロジェクトにて、 **プログラミングするときだけこれらをクラスパスに含め**  
エラーが出ないように＆メソッドなどがわかるように（リフレクションなしで普通に開発できるように）して、
**実際にjarを出力するときにはこれらjarをクラスパスから除外** し、  
でもjarには内包して定義したクラスローダーから動的に切り替えようと思いました。  
が、うまくいきませんでした。

この方法で実現可能な方法はありますか？（jarに含めたライブラリを動的に切り替える
でもプログラミングするときは可視的に行いたいのでクラスパスに含めたときと同じ感覚で行いたい）

一番それっぽいことは試しました。

> ・Java Build Path 設定にて jarライブラリを追加する これにより開発時には普通にプログラミングできる
>
> ・jar生成時にクラスパスに通さないために RunConfiguration の クラスパス タブにて User Entries を消して  
>  Add  
>  Project で再度追加して ライブラリjar を除外しましたが、これを行うと jar に jarライブラリが含まれない状態になってしまいました。


CC BY-SA 3.0
2017-01-04T09:32:48.940
31611
2017-01-09T08:23:11.817
2017-01-06T08:21:40.877
10346
10346
question
java eclipse
JARに内包した「ライブラリJAR」を動的に切り替えたい


複雑な仕組みを考える必要はなく、単に開発時とリリース時でビルド設定を分ければ良いだけかと思います。  
つまり、開発時にはデバッグ接続用jarライブラリのみを依存関係に含め、リリースビルドではリリース接続用jarライブラリのみを依存関係に含めれば良いのでは、ということです。

* * *

上記を実現する手段は何通りもありますが、1例としては次のような設定法があります。

  * 開発時依存関係設定は現状のEclipseの設定を用いる
  * リリース時ビルド(リリース時依存関係設定)はMavenを用いる

前者は既に行えていることですので、後者のリリースビルド設定をMavenの`pom.xml`に書き下せば良いだけです。

このような方法はEclipseプロジェクト設定とMavenの`pom.xml`に設定が散在するので管理上問題がある、ということであれば、双方の設定をMavenで管理し、開発向け/リリース向けをprofileで切り替える方法(1例として次のリンク参照)もあります。

  * [mavenで環境ごとに使うjarを変える - quartetteの日記](http://d.hatena.ne.jp/quartette/20121112)

現行バージョンのEclipseはMaven設定を取り込めますしprofileの切り替えも行えますのでMaven管理することに障害は無いと考えます。


CC BY-SA 3.0
2017-01-06T05:28:04.303
31657
2017-01-06T05:28:04.303
2808
31611
answer


典型的なコンパイル/パッケージングと異なるのは以下の点であると考えます。

  * コンパイル時にはクラスパスに含めるが、 パッケージング時にはクラスパスには含めない
  * jar の中の jar をロードする

前者については、確に典型的ではないものの、コンパイル時、パッケージング時と全く異なるタイミングの話なので一般的なビルドツールで(あるいは手動でも)実現することは難しくないでしょう。  
ただし、EclipseのRunnable-Jar export機能ではこの2つが分離できないので、(特殊な条件時以外)実現不可能なように見えます。

後者については、標準SDKの機能には無いため自作する必要がありますが、下記リンク先にある通り既存の実装がいくつか存在するためそれらを利用することもできるでしょう。

  * [実行可能jarに外部jarを含めるためのライブラリ調査 - iWA’s 雑記@はてな出張所](http://d.hatena.ne.jp/vmi/20100812/p1)

* * *

前者についてMavenで、後者について[`jarinjarloader`](http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/plain/org.eclipse.jdt.ui/jar%20in%20jar%20loader/org/eclipse/jdt/internal/jarinjarloader)(EclipseがFat
Runnable-Jar作成時に使用しているクラス群)で解決したサンプルを作成してみました。

  * <https://github.com/yukihane/so31611-selectable-jar-loading>

[`JarRsrcLoader`](http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/plain/org.eclipse.jdt.ui/jar%20in%20jar%20loader/org/eclipse/jdt/internal/jarinjarloader/JarRsrcLoader.java)(補足:
このクラスはEclipseのexport機能でFat Jarを生成したときのMain-Class)でjar-in-
jarのロードを行っているのでこれを参考に[`Launcher`](https://github.com/yukihane/so31611-selectable-
jar-
loading/blob/answer01/so31611-main/src/main/java/com/github/yukihane/so31611/Launcher.java#L13-L27)クラスを作り、ここでロードするjarを選択しロードします。

[後続のコードで`new Module()`した](https://github.com/yukihane/so31611-selectable-jar-
loading/blob/answer01/so31611-main/src/main/java/com/github/yukihane/so31611/Main.java#L8)ときに使われるのは、さきほど選択したjarに含まれる方のクラスになります。

これらのMavenモジュールをEclipseでインポートした場合は[`pom.xml`の記述](https://github.com/yukihane/so31611-selectable-
jar-
loading/blob/answer01/so31611-main/pom.xml#L21-L25)で依存関係が解決されるのでEclipse上での開発にも支障はありません。


CC BY-SA 3.0
2017-01-09T08:23:11.817
31724
2017-01-09T08:23:11.817
2808
31611
answer