所以我在我编写的一个模块中有一些类来帮助进行 Robolectric 风格的单元测试,我希望能够在我的一堆其他模块中共享这个模块。这个模块有自己的单元测试,我把它设置为apklib。我正在使用 maven-android-plugin。问题似乎是它无法识别测试范围内的apklibs。是否有任何解决方法,或者我错过了什么?
我注意到的一件事是,如果我mvn install
运行命令,一切都会构建并且我所有的测试都运行良好,但是如果我这样做mvn test
它说它找不到类。
>Maven有"反应堆"的概念,这只是正在建造的项目列表的一个花哨的术语。在 Maven 构建开始时和结束时,Maven 打印出此项目列表(如果已定义,则使用 /project/name
(XPath) 或其他groupId:artifactId
)。
对于反应堆中的每个项目,Maven 都会维护一个已附加的工件列表。默认情况下,每个模块的pom.xml
都附加,并且随着每个插件的运行,它们可以选择附加其他工件。大多数插件不附加工件,这里有一些插件可以附加:
-
jar:jar
创建一个.jar
并将其附加为主工件(除非您在配置中指定分类器) -
war:war
创建.war
并附加它 -
source:jar
创建源代码 Java 代码的.jar
,并将其附加到分类器source
-
javadoc:jar
创建JavaDocs的.jar
,并将其与分类器javadoc
-
android:apklib
创建一个.apklib
项目并将其附加为主项目
还有一个默认的主工件(这是被jar:jar替换的工件),它实际上是一个目录而不是文件,因此它不会被安装或部署到本地存储库缓存或远程存储库。
因此,当在反应器中,并且附加主工件的插件尚未运行(在您的情况下android:apklib
),并且另一个插件要求主工件,它将${project.build.outputDirectory}
提供目录。如果在附加的主工件之后,则将提供该主工件。
test
阶段发生在package
阶段之前,因此将传递目录而不是.apklib
。
在多模块项目中,事情变得更加复杂(这是我的长介绍应该帮助你的地方)
Maven 必须构建测试类路径。如果其中一个依赖项位于反应器内,Maven 将使用附加到反应器的工件。否则,它将使用本地缓存(如有必要,从远程存储库填充)。
当您运行时
mvn test
在从根目录开始的多mdule项目中,没有替换默认(基于目录的)工件,因此模块内的类路径将指向目标/类目录(我们假设android插件知道如何处理此类测试...你发现它没有)。
当您运行时
mvn package
或
mvn install
但是,在同一项目中,由于每个模块按顺序完成其生命周期,因此所有依赖模块都将在其.apklib
文件中交换为其附加工件。
这里很可能的问题是您测试无法使用目录,需要实际的.apklib
文件。 在这种情况下,您别无选择,只能将生命周期至少推到package
阶段。