/usr/share/java ライブラリを Web アプリのクラスパスに追加するにはどうすればよいですか?
-
02-07-2019 - |
質問
まとめ
Linux + tomcat5.5 にデプロイされた Web アプリですべてを使用/表示することは可能ですか? /usr/share/java/
自動的に瓶に詰めますか?
詳細
私はJava WebアプリケーションをUbuntu用にパッケージ化しており(ただし、質問はLinuxベースのディストリビューションに関連しています)、それをTomcatに依存させるつもりです。
コンテキスト記述子 (XML ファイル) を配置します。 /usr/share/tomcat5.5/conf/Catalina/localhost/
アプリをデプロイするために。ここに私のWebディレクトリがあります: /usr/share/<appname>/web
, 、システムにインストールされている Java jar ライブラリをアプリで使用できるようにするにはどうすればよいですか (/usr/share/java
)?
シンボリックリンクだけではできない /usr/share/java -> <webdir>/WEB-INF/lib
, 、カスタムの jar を配置する必要があるため、 lib
監督。
悪い解決策
私がこれまでに見つけた解決策は、必要な各jarをシンボリックリンクすることです。 <webdir>/WEB-INF/lib/
.
これはあまり良いことではありません。なぜなら、多くの jar をシンボリックリンクする必要があり、さらに悪いことに、直接の依存関係ライブラリ (jar) が必要とするすべての jar をシンボリックリンクする必要があるからです (その他)。直接の依存関係ライブラリが必要な jar のリストを変更した場合に備えて、そのシンボリックリンクを維持する必要があります。
解決
そんなことはすべきではありません。Java EE アプリケーションは自己完結型であることが想定されており、コンテナによって提供されるもの以外のデプロイメント パッケージの外部のリソースには依存しません。したがって、そのディレクトリから必要なライブラリを取得し、それを war または Ear パッケージに追加する必要があります。
これにより、アプリケーションがどこに展開しても同じように動作し、/usr/share/java.... 内のライブラリのバージョンが予期せず変更されることがないことが保証されます。
他のヒント
によると Tomcat クラスローディングのドキュメント, すべての Tomcat アプリで使用できる共有ライブラリを $CATALINA_BASE/shared/lib ライブラリに置く必要があります。そのため、あなたがやろうとしていることを行う 1 つの方法は、ライブラリを /usr/share/ から移動することです。 java を $CATALINA_BASE/shared/lib にコピーします。
しかし、同じドキュメントを誤解していなければ、Tomcat はシステム全体の CLASSPATH 変数の内容も起動時にクラスローダーで利用できるようにします。つまり、ディレクトリ -- /usr/share/java -- がシステム全体の CLASSPATH に含まれていた場合、変数であれば、それも機能するはずです。ただし、私はこれをやったことがありません。$CATALINA_BASE/shared/lib の内容を Tomcat 全体で利用できるようにする Tomcat の方法は、常に完璧に役に立ちます。
entzikの答えは私に次の解決策をもたらしました。
修正された「悪い解決策」を使用します(質問を参照)。
変更点は次のとおりです。
- すべての依存関係について特定のパッケージ バージョンに依存します (deb 用にパッケージ化するときに「制御」ファイルに影響します)
例: libcommons-io-java ( = 1.3.1) ただの代わりに libcommons-io-java - 「一般化された」ものではなく、「/usr/share/java」内の実際のjarファイルへのシンボリックリンク
例:
webdir/WEB-INF/lib/commons-io.jar -> /usr/share/java/commons-io-1.3.1.jar
そしてそうではありません
webdir/WEB-INF/lib/commons-io.jar -> /usr/share/java/commons-io.jar
この変更により、管理者が新しいバージョンのライブラリ (commons-io など) をインストールした場合に Web アプリが壊れることがなくなります。
欠点は、このアプローチでは明らかに、1 つのアプリのみで使用されるバージョンのライブラリがシステムに追加されるため、バージョンの競合により他のアプリケーション/ライブラリがインストールできないという問題が発生する可能性があることです。ライブラリに関して言えば、潜在的な問題は両方とも軽微だと思います。
2 つのオプションがあります。1 つはクラスローダーがすべての Java プログラムにライブラリを提供すること、もう 1 つはクラスローダーがすべての Tomcat コンテキストにライブラリを提供することです。
シンボリックリンクを /usr/lib/jvm/java-1.5.0-sun-1.5.0.11/jre/lib (このパスに別のバージョンを指定する必要がある場合があることに注意してください) に追加して、すべての Java プログラムがこれらのライブラリにアクセスできるようにします。すべての Tomcat コンテキストからアクセスできるように、それらを var/lib/tomcat5.5/shared/libs にある Tomcat の共有ライブラリに追加します (バージョン番号は異なる場合があります)。
これらのディレクトリの場所は Ubuntu "Feisty" から取得されたものであることにも注意してください。