【发布时间】:2013-01-21 17:49:25
【问题描述】:
如果这是补救措施,请原谅我,但我对 Maven 和它的功能仍然很陌生。
在我的项目中,当它“构建”并进入编译阶段时,它将创建一个包含刚刚编译的库的目标目录并更新(如果不存在,则创建)本地 .m2 目录。
当我进入“测试”阶段时,我希望它针对目标目录的库文件而不是本地 .m2 目录进行构建。
任何提示、建议或建议将不胜感激。谢谢!
【问题讨论】:
如果这是补救措施,请原谅我,但我对 Maven 和它的功能仍然很陌生。
在我的项目中,当它“构建”并进入编译阶段时,它将创建一个包含刚刚编译的库的目标目录并更新(如果不存在,则创建)本地 .m2 目录。
当我进入“测试”阶段时,我希望它针对目标目录的库文件而不是本地 .m2 目录进行构建。
任何提示、建议或建议将不胜感激。谢谢!
【问题讨论】:
Maven 有“反应器”这个概念,这只是对正在构建的项目列表的一个花哨的术语。在 Maven 构建开始和结束时,Maven 会打印出这个项目列表(如果已定义则使用 /project/name,否则使用 groupId:artifactId)。
对于反应器中的每个项目,Maven 都会维护一个已附加工件的列表。默认情况下,每个模块的pom.xml 都已附加,并且随着每个插件的运行,它们可以选择附加其他工件。大多数插件不附加工件,以下是一些插件:
jar:jar 创建一个 .jar 并附加它war:war 创建一个 .war 并附加它source:jar 创建源 Java 代码的 .jar 并将其附加到 source 的分类器
java doc:jar 创建 JavaDocs 广告的 .jar 并附加一个分类器 javadoc
还有一个默认的主工件(这是被jar:jar 替换的那个),它实际上是一个目录而不是文件,因此它不会安装或部署到本地存储库缓存或远程存储库。
因此,当在反应器中,附加主工件的插件尚未运行,而另一个插件请求主工件时,它将被赋予目录${project.build.outputDirectory}。如果在附加主要工件之后,则将提供该主要工件。
test 阶段发生在package 阶段之前,因此将使用目录而不是.jar。 integation-test 阶段发生在之后,因此将始终使用 .jar。
在一个多模块项目中事情变得更加复杂(这是我的长篇介绍应该帮助你的地方)
Maven 必须构建测试类路径。如果依赖项之一在反应器内,Maven 将使用附加到反应器的工件。否则它将使用本地缓存(必要时从远程存储库填充)。
当你跑步时
mvn test
在来自根的多模块项目中,没有替换默认(基于目录的)工件,因此模块内类路径将指向 target/classes 目录。
当你跑步时
mvn package
然而,在同一个项目中,由于每个模块按顺序完成其生命周期,所有依赖模块都将在它们的 .jar 文件中交换为它们的附加工件。
所有这些都应该向您表明 Maven 正在做明智的事情。希望这有帮助。
【讨论】:
-pl、-am 和 -amd 选项,它不必是完整的集合,而只是模块树的一个子集。
test 阶段将对您的项目执行测试。该项目不会通过依赖机制引用自己。只有依赖项将通过您的本地存储库引用,即.m2/repository
此外,将工件安装到本地存储库的不是compile 阶段,而是install 阶段。然后,还有一个名为deploy 的后期阶段,它将将工件部署到远程存储库,前提是您将远程存储库配置为部署目标。注意,安装和部署几乎是相同的阶段,除了安装是本地唯一的事情;因此,在进行开发环境工作时,这是常见的构建阶段。通常构建服务器会做部署的东西。
【讨论】: