Mavenには、この「リアクター」の概念があります。これは、構築中のプロジェクトのリストを表すための単なる空想用語です。Mavenビルドの開始時と終了時に、Mavenはこのプロジェクトのリストを/project/name
(定義されているかどうかにかかわらず(XPath)を使用してgroupId:artifactId
)出力します。
リアクター内のプロジェクトごとに、Mavenは添付されたアーティファクトのリストを維持します。デフォルトでは、各モジュールpom.xml
がアタッチされており、各プラグインが実行されると、追加のアーティファクトをアタッチするオプションがあります。ほとんどのプラグインはアーティファクトをアタッチしません。アタッチするプラグインは次のとおりです。
jar:jar
を作成し、.jar
それをプライマリアーティファクトとして添付します(構成で分類子を指定しない限り)
war:war
を作成し.war
て添付します
source:jar
.jar
ソースJavaコードのを作成し、の分類子を付加します。source
javadoc:jar
.jar
のJavaDocsを作成し、の分類子を付加します。javadoc
android:apklib
.apklib
アーティファクトを作成し、それをプライマリアーティファクトとして添付します
デフォルトのプライマリアーティファクト(これはjar:jarに置き換えられます)もあります。これは実際にはディレクトリであり、ファイルではないため、ローカルリポジトリキャッシュまたはリモートリポジトリにインストールまたはデプロイされません。
したがって、reactor内で、プライマリアーティファクトをアタッチするプラグインがまだ実行されておらず(あなたの場合android:apklib
)、別のプラグインがプライマリアーティファクトを要求すると、ディレクトリが与えられ${project.build.outputDirectory}
ます。プライマリアーティファクトがアタッチされた後、そのプライマリアーティファクトが提供されます。
フェーズはtest
フェーズの前に発生するpackage
ため、ではなくディレクトリを渡し.apklib
ます。
マルチモジュールプロジェクトでは事態はさらに複雑になります(これは私の長いイントロがあなたを助けるはずです)
Mavenはテストクラスパスを構築する必要があります。依存関係の1つがリアクター内にある場合、Mavenはリアクターにアタッチされたアーティファクトを使用します。それ以外の場合は、ローカルキャッシュを使用します(必要に応じてリモートリポジトリからデータを入力します)。
あなたが走るとき
mvn test
ルートからの複数のプロジェクトでは、デフォルトの(ディレクトリベースの)アーティファクトの置き換えはないため、モジュール内のクラスパスはターゲット/クラスディレクトリになります(Androidプラグインはそのようなテストの処理方法を知っていると想定しています) ...そうではないことがわかりました)。
あなたが走るとき
mvn package
また
mvn install
ただし、同じプロジェクトでは、各モジュールがライフサイクルを順番に完了するため、すべての依存モジュールは.apklib
、添付されたアーティファクトとしてファイルをスワップインします。
ここでの問題の可能性が最も高いのは、テストがディレクトリで機能せず、実際の.apklib
ファイルが必要になることです。その場合、ライフサイクルを少なくともpackage
フェーズにプッシュする以外に選択肢はありません。