0

Maven でテストを実行しているときに、ClassNotFoundException が原因で NoClassDefFoundError が発生しました。見つからなかったクラスは、ローカル リポジトリに確実に存在します。

問題のある依存関係は次のようになります。デフォルトのスコープ付き依存関係は、スコープが提供済みとしてマークされている jar に依存しており、クラスローダーによって検出されなかったファイルはその jar 内にあります。アプリの実行中にファイルが見つからないため、問題なくコンパイルされます。

その「提供されたjar」をランタイムスコープの依存関係として明示的にpomに追加することでエラーを修正しましたが、何が起こっているのかを理解したいです。

1) いくつかのテストを実行している場合、依存スコープ = 提供されるの意味は何ですか? サーブレット コンテナーには、servlet-api.jar などの提供された jar を含めることができることは理解していますが、テストについてはどうでしょうか。これは、pom のエラーのようですね。「提供された」スコープを使用する必要がある場合、servlet-api.jar (および類似の Web サーバー jar) 以外のケースはありますか?

2) この問題の解決策を探しているときに、maven コマンドライン パラメーター -U を使用しようとしました。私が理解している限りでは、Maven にリモート リポジトリをチェックさせ、必要に応じてそこから依存関係を最新のものにするように強制します。問題は、このコマンドを指定しないとどうなるかということです。ローカルリポジトリから常に古い依存関係を取得しますか? そうでない場合、なぜこのコマンドが必要なのですか?

3) このような問題を解決するには、コードをコンパイルするときに実際にクラスパスにある jar と、コードを実行するときにそこにある jar を知っておくとよいでしょう。Mavenで可能ですか?

4

2 に答える 2

2

1)常に提供されるということは、依存関係をビルドされたアーティファクトにコピーしてはならないことを意味します。一部の依存関係が提供されていると宣言されているテストは、これらの依存関係が実行時に必要になるため、実行されません。この問題は、たとえば独自のプロファイル「テスト」を作成することで解決できます。したがって、「テスト」プロファイルで、依存関係をデフォルトスコープとして宣言すると、提供されたスコープが上書きされます。その後、次のコマンドでテストを実行できます。

`mvn <goal> -PTest`

詳細については、プロファイルの概要を参照してください。

2)私の知る限り、リポジトリが壊れている可能性があるため(たとえば、そこでファイルを変更または削除した場合)、コマンドラインパラメーター-Uによって依存関係が新たにフェッチされます。

3)mvn dependency:tree

于 2012-09-18T08:19:32.720 に答える
1

1)「テストコンテナ」(Jetty、Tomcat)を使用してテストを実行できます。この場合も、スコープが適切であれば(たとえば、prodでtomcatを使用しますが、jettyを使用した単体テストでは意味がありません)。提供されているjarと同じバージョンを使用してください)。

2)Mavenはデフォルトで、ローカルリポジトリで見つかったjarを取得し、スナップショットでない場合は、より新しいjarを検索しません。独自のjarを提供する場合は、ときどき煩わしい場合でも、常にバージョンをインクリメントする必要があります。

3)mvndependentity:treeは、プロジェクトのすべての依存関係ツリーを提供できます。一部のIDE(私はEclipseを使用しています)は、それらを表示するための優れたUIツールを提供します。

于 2012-09-18T08:21:07.223 に答える