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 必须构建测试类路径。如果依赖项之一在反应器内,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 回答