今月初めの 第10回#渋谷Javaで久しぶりに登壇してトークしたのですが、その内容が実は大嘘でしたという話です。
資料がこれ。
かいつまんで言うと
- JREには拡張機能機構というのがもともとあって、
- $JAVA_HOME/lib/ext (javaのシステムプロパティで言うとjava.ext.dirs)に自前のjarを置くと自動的にクラスパスに含まれるので
- そういう形でアプリもJREもセットでサーバにデプロイするようにすればいろいろ設計する手間が省けて何かと幸せになれるかもね
という趣旨でした。
ところがぎっちょん
2015/3/3つまり第10回#渋谷Javaのたった三日前。Java8u40 がリリースされていました。まったく気にしていなかったのですが、 そのリリースノートには衝撃の内容が。
推奨規格オーバーライド機構と拡張機能機構は非推奨であり、今後のリリースで削除される可能性があります。実行時の変更はありません。 「推奨規格オーバーライド」機構または「拡張機能」機構を使用している既存のアプリケーションは、 これらの機構を使用しないよう移行することをお薦めします。これらの機構を既存で使用しているかを識別するために、 -XX:+CheckEndorsedAndExtDirsコマンド行オプションを使用できます。次のいずれかの条件がtrueの場合、失敗します。JDK 8u40以降のリリースで、-XX:+CheckEndorsedAndExtDirsコマンド行オプションがサポートされます。
- -Djava.endorsed.dirsまたは-Djava.ext.dirsシステム・プロパティがデフォルトの場所を変更するために設定されているか、
- ${java.home}/lib/endorsedディレクトリが存在するか、
- ${java.home}/lib/extにJDKに同梱されているファイル以外のJARファイルが含まれているか、
- プラットフォーム固有のシステム全体の拡張ディレクトリにJARファイルが含まれている。
#渋谷javaの会場で「java1.4,5,6,7,8まである機能がそんな簡単に消えやしませんから安心して使っちゃいましょう!」って高らかに宣言した私の立場ナッシング。
詳しくは追ってないのですがどうやらJavaアプリケーションのパッケージング機構に関してJCEで別の議論が進んでいるようで、それにからんで古いほうの機構は削除の方向らしいです。 それにしても少なくともJava1.4以降ずっとあった機能が削除されようとは!しかもこのタイミングでw
そんなわけですが、開発したJavaアプリをJREとセットでデプロイしちゃおうぜというアイデアが実現不可能になったわけではまったくないので、普通にJREとアプリとをそれぞれサーバ上に展開し、java -classpath "自作のjarと依存jarの展開先dir/*" com.example.MyMain みたいな感じでclasspathをワイルドカード指定しちゃえばいいと思います。