27

私はちょうど別の*I-though-I-was-using-this-version-of-a-library-but-apparently-my-app-server-has-already-loaded-an-older-version-ofを解決しました-this-library- * issue(ため息)。

アプリケーションがすべての適切なjarファイルまたはロードされたクラスバージョンにアクセスできるかどうかを確認(または監視)するための良い方法を知っている人はいますか?

前もって感謝します!

[PS私の見解ではOSGiモジュールアーキテクチャを使い始める非常に良い理由です!]

更新この記事も役に立ちました!ログファイルに書き込むことで、JBossのクラスローダーがどのクラスをロードしたかを知ることができました。

4

5 に答える 5

19

JBoss を使用している場合は、特定のクラスをロードしたすべてのクラスローダーを要求できる MBean (クラスローダーリポジトリ iirc) があります。

他のすべてが失敗した場合、java -verbose:classロードされているすべてのクラス ファイルの jar の場所を表示するものは常にあります。

于 2008-09-26T21:05:08.677 に答える
6

jar マニフェストに適切なバージョン情報がある場合は、バージョンを取得してテストする方法があります。マニフェストを手動で読み取る必要はありません。

java.lang.Package .getImplementationVersion() と getSpecificationVersion() と isCompatibleWith() は、探していることを実行するように聞こえます。

パッケージは this.getClass().getPackage() などの方法で取得できます。

java.lang.Package の javadoc は、これらの属性の特定のマニフェスト属性名を示していません。Google で簡単に検索すると、http://java.sun.com/docs/books/tutorial/deployment/jar/packageman.htmlで見つかりました。

于 2008-10-02T21:01:11.053 に答える
3

Javaの現在のバージョンでは、ライブラリのバージョニングは、JARが有用なマニフェストとともに正しくパッケージ化されていることに依存するかなり厄介な用語です。それでも、実行中のアプリケーションがこの情報を便利な方法で収集するのは大変な作業です。JVmランタイムは、何の助けにもなりません。

最善の策は、ビルド時にこれを適用し、IvyやMavenなどの依存関係管理ツールを使用してすべての正しいバージョンをフェッチすることだと思います。

興味深いことに、Java 7には、まさにこの種のもののための適切なモジュールバージョン管理フレームワークが含まれている可能性があります。それは現時点であなたを助けるというわけではありません、

于 2008-09-26T14:16:57.300 に答える
2

それを確認する良い方法はないと思います。そして、あなたがそれをしたいかどうかわかりません。あなたがしなければならないことは、アプリサーバーのクラスローディングアーキテクチャに慣れ、それがどのように機能するかを理解することです.

それがどのように機能するかを簡単に説明すると、EJB または Web アプリケーションは、最初に独自のモジュール (ejb-jar または war) で宣言されたライブラリ内のクラスまたはリソースを探します。そこにクラスが見つからない場合、クラスローダーは、宣言された依存関係 (通常は ejb) である親クラスローダー、または ear パッケージで宣言されたライブラリとリソースをロードする役割を持つアプリケーションクラスローダーにリクエストを転送します。 . クラスまたはリソースがまだ見つからない場合、リクエストはアプリ サーバーに転送され、アプリ サーバーは独自のクラスパスを調べます。

そうは言っても、Java EE モジュール (web-app、ejb) は常に最も近いスコープにある jar からクラスをロードすることを覚えておく必要があります。たとえば、log4j v1 を war ファイルにパッケージ化し、log4j v2 を ear レベルでパッケージ化し、log4j v3 を app-server のクラス パスに配置すると、モジュールは独自のモジュールで jar を使用します。それを取り除くと、耳の高さのものを使用します。それを取り出すと、アプリサーバーのクラスパスにあるものが使用されます。モジュール間に複雑な依存関係がある場合、事態はさらに複雑になります。

最良の方法は、アプリケーション グローバル ライブラリを ear レベルに配置することです。

于 2008-09-26T13:56:30.187 に答える
0

私がやっている方法よりも良い方法があるに違いありませんが、私はこれを非常に手動の方法で行う傾向があります.

  1. すべての Jar のファイル名にはバージョン番号が含まれている必要があります (名前が変更されない場合)。
  2. 各アプリケーションには独自のクラスパスがあります。
  3. 更新された Jar (新しいバージョン) の使用を開始する理由があるに違いありません。利用できるからという理由だけでなく、必要な機能が提供されるからという理由で変更してください。
  4. 各リリースには、必要なすべての Jar が含まれている必要があります。
  5. 必要な Jar のリスト (これはソース ファイルにコード化されています) を認識し、クラスパス内の Jar のリストに対して実行時にチェックできる Version クラスを保持します。

私が言ったように、それは手動ですが、うまくいきます。

于 2008-09-26T13:57:36.923 に答える