0

これが改善策である場合は申し訳ありませんが、私はまだ Maven に不慣れであり、その機能です。

私のプロジェクトでは、「ビルド」してコンパイル段階に到達すると、コンパイルされたばかりのライブラリを含むターゲット ディレクトリが作成され、ローカルの .m2 ディレクトリが更新 (または作成) されます。

「テスト」フェーズに到達したら、ローカルの .m2 ディレクトリではなく、ターゲット ディレクトリのライブラリ ファイルに対してビルドする必要があります。

ヒント、推奨事項、または提案をいただければ幸いです。ありがとう!

4

2 に答える 2

4

Maven には、この「リアクター」という概念があります。これは、構築中のプロジェクトのリストを表す派手な用語です。Maven ビルドの開始時と終了時に、Maven はこのプロジェクトのリストを (/project/name定義されているかどうかを使用してgroupId:artifactId) 出力します。

リアクター内のプロジェクトごとに、Maven はアタッチされたアーティファクトのリストを維持します。デフォルトでは、各モジュールpom.xmlがアタッチされており、各プラグインが実行されると、追加のアーティファクトをアタッチするオプションがあります。ほとんどのプラグインはアーティファクトを添付しません。これを行うプラグインを次に示します。

  • jar:jarを作成し.jarて添付します
  • war:warを作成し.warて添付します
  • source:jar.jarソース Java コードの を作成し、それをsource
  • java doc:jar.jarJavaDocs 広告のを作成し、次の分類子を添付しますjavadoc

デフォルトのプライマリ アーティファクト (これは に置き換えられるものですjar:jar) もありますが、これは実際にはファイルではなくディレクトリであるため、ローカル リポジトリ キャッシュまたはリモート リポジトリにインストールまたはデプロイされません。

したがって、リアクター内で、プライマリ アーティファクトをアタッチするプラグインがまだ実行されておらず、別のプラグインがプライマリ アーティファクトを要求すると、ディレクトリが与えられ${project.build.outputDirectory}ます。一次成果物が添付された後に、その一次成果物が提供されます。

フェーズはtestフェーズの前に発生するpackageため、. ではなくディレクトリを使用し.jarます。フェーズは後に発生するintegation-testため、常に.jar.

マルチモジュール プロジェクトでは物事がより複雑になります (これについては、私の長い紹介が役に立ちます)。

Maven はテスト クラスパスを構築する必要があります。依存関係の 1 つがリアクター内にある場合、Maven はリアクターにアタッチされたアーティファクトを使用します。それ以外の場合は、ローカル キャッシュが使用されます (必要に応じてリモート リポジトリから入力されます)。

走るとき

mvn test

ルートからのマルチモジュール プロジェクトでは、デフォルトの (ディレクトリ ベースの) アーティファクトに代わるものはないため、モジュール内のクラスパスはtarget/classesディレクトリになります。

走るとき

mvn package 

ただし、同じプロジェクトでは、各モジュールがライフサイクルを順番に完了するため、すべての依存モジュールは.jar、添付されたアーティファクトとしてファイルにスワップされます。

これらすべてから、Maven が賢明なことを行っていることがわかります。これが役に立ったことを願っています。

于 2013-01-21T20:24:43.377 に答える
3

このtestフェーズでは、プロジェクトでテストを実行します。プロジェクトは、依存関係メカニズムを介してそれ自体を参照しません。依存関係のみがローカルリポジトリを介して参照されます。.m2/repository

また、compileアーティファクトをローカルリポジトリにインストールするフェーズではなく、installフェーズです。次に、と呼ばれる後のフェーズがありdeployます。これは、リモートリポジトリがデプロイターゲットとして構成されている場合に、アーティファクトをリモートリポジトリにデプロイします。インストールとデプロイは、インストールがローカルのみのものであることを除いて、ほぼ同じフェーズであることに注意してください。したがって、開発環境の作業を行うときにヒットするのは、一般的なビルドフェーズです。通常、ビルドサーバーがデプロイを実行します。

于 2013-01-21T18:00:59.630 に答える