Maven 无法识别测试范围内的 apklib 依赖项



所以我在我编写的一个模块中有一些类来帮助进行 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阶段。

最新更新