1

Mavenprovidedスコープと Java クラスローダーの使用方法を誤解しています。

クラスMyClassがあり、このクラスには、serialize()シリアライズ時に使用する JSON ライブラリを記述する列挙型を受け取るメソッドがあるとします。

これらの JSON ライブラリの 1 つは内部のもので、MyClass 用に配布する JAR に含まれています。単純。

もう 1 つの JSON ライブラリは、ユーザーに提供を強制したいサード パーティのライブラリです。したがって、私はそれを<scope>provided</scope>ポンポンの下に置きました。

テスト中はすべてうまくいきますが、クラスパスにサードパーティの JSON ライブラリを使用せずに外部から独自のライブラリを使用しようとすると、まったく呼び出しを行っていないにもかかわらずClassNotFoundException、sが発生します。serialize()

私は、クラスは「必要に応じて」ロードされるだけであると想定していましたserialize()。. 私が間違っている?私がここで得ていることを達成する方法はありませんか?

4

4 に答える 4

0

まず、必要なときにクラスをロードすることについてのあなたの仮定は一般的に正しいですが、それはあなたが思っているものとはかなり異なって機能します。クラスは、それが参照するすべてのクラスとともに、必要に応じてクラスローダーによってロードされます。それは再帰的に起こります。したがって、初めて使用するときMyClass、classloaderは、参照されるこのサードパーティのJSONlibクラスをロードしようとします。あなたが話している一種の実行時クラスのロードは、Javaリフレクション機能を使用することで可能です。しかし、おそらくすでにご存知のように、それはかなり異なることです。

2つ目はprovided、Mavenのスコープです。と同じようcompileに機能しますが、依存関係はアーティファクトと「一致」しません。つまり、この依存関係はコンパイル時とテスト実行で利用できます(その後、Mavenによって提供されます)。ただし、アーティファクトの推移的な依存関係としては表示されません(これに依存するアーティファクトによる)。したがってWEB-INF/lib、アーティファクトに依存するWARのディレクトリにコピーされることも、次jar-with-dependenciesの記述子によってアセンブルされることもありません。maven-assembly-plugin。ここでは、アーティファクトのユーザーがこの依存関係を自分で提供するという強い仮定があります。したがって、これらのクラスをクラスパスに提供するのが彼の仕事です。通常、これはJava EEアプリケーションサーバーで使用され、サーブレットAPI、JPA、EJB、JMSなどのプラットフォーム関連の依存関係が常に利用可能です。providedアプリケーションがこれらのAPIを使用する場合は、スコープでそれらに依存します。

したがって、最後に、あなたの場合、compileこの依存関係が本当に必要なので、defaut、scopeを使用する必要があります。

于 2012-04-24T20:18:34.103 に答える
0

提供されたスコープは、基本的に実行時に使用できることを意味します。通常、JSON などのサードパーティ ライブラリには当てはまりません。独自の jar をパッケージ化するため、必要なすべてのクラスをそこに含める必要があります。通常、Maven ユーザーは Maven Assembly Plugin のようなものを使用して、Maven が必要な依存関係をまとめて単一の jar を作成できるようにします。

于 2012-04-24T19:15:30.827 に答える
0

「提供」は、後で実行時に提供されることを意味するため、依存関係に含めないでください (たとえば、アプリケーションを WAR または JAR にパッケージ化する場合)。

これが使用される場合の良い例 - API に対してコンパイルする場合、たとえば Java EE API では、コンパイル時に jar が必要ですが、サーバーにはそれらがあるため、WAR ファイルに含める必要はありません。定義によるクラス。

コンパイルするサーブレット クラスが必要ですが、WAR ファイルは常に、コンテナーのクラスパス上にすでにあるコンテキストで使用されます。

于 2012-04-24T19:57:31.570 に答える
0

問題が見つかりました。問題を引き起こしているサードパーティの JSON ライブラリを呼び出していた静的イニシャライザがありました。

私がAPIのユーザーであり、サードパーティのJARを提供していない場合、クラスが見つからないことが予想されます。しかし、私の懸念は、JAR を必要とするような呼び出しを行っていないことでした。静的イニシャライザは私を失望させました。

于 2012-04-24T23:01:10.893 に答える