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で可能ですか?