【问题标题】:Maven: Change the "test" phase directory from local .m2 to target?Maven:将“测试”阶段目录从本地 .m2 更改为目标?
【发布时间】:2013-01-21 17:49:25
【问题描述】:

如果这是补救措施,请原谅我,但我对 Maven 和它的功能仍然很陌生。

在我的项目中,当它“构建”并进入编译阶段时,它将创建一个包含刚刚编译的库的目标目录并更新(如果不存在,则创建)本地 .m2 目录。

当我进入“测试”阶段时,我希望它针对目标目录的库文件而不是本地 .m2 目录进行构建。

任何提示、建议或建议将不胜感激。谢谢!

【问题讨论】:

    标签: maven target


    【解决方案1】:

    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 阶段之前,因此将使用目录而不是.jarintegation-test 阶段发生在之后,因此将始终使用 .jar

    在一个多模块项目中事情变得更加复杂(这是我的长篇介绍应该帮助你的地方)

    Maven 必须构建测试类路径。如果依赖项之一在反应器内,Maven 将使用附加到反应器的工件。否则它将使用本地缓存(必要时从远程存储库填充)。

    当你跑步时

    mvn test
    

    在来自根的多模块项目中,没有替换默认(基于目录的)工件,因此模块内类路径将指向 target/classes 目录。

    当你跑步时

    mvn package 
    

    然而,在同一个项目中,由于每个模块按顺序完成其生命周期,所有依赖模块都将在它们的 .jar 文件中交换为它们的附加工件。

    所有这些都应该向您表明 Maven 正在做明智的事情。希望这有帮助。

    【讨论】:

    • 说到“reactor”中的“projects”,和modules是一回事吗?
    • 大多数情况下,尽管使用 Maven 3 的 -pl-am-amd 选项,它不必是完整的集合,而只是模块树的一个子集。
    【解决方案2】:

    test 阶段将对您的项目执行测试。该项目不会通过依赖机制引用自己。只有依赖项将通过您的本地存储库引用,即.m2/repository

    此外,将工件安装到本地存储库的不是compile 阶段,而是install 阶段。然后,还有一个名为deploy 的后期阶段,它将将工件部署到远程存储库,前提是您将远程存储库配置为部署目标。注意,安装和部署几乎是相同的阶段,除了安装是本地唯一的事情;因此,在进行开发环境工作时,这是常见的构建阶段。通常构建服务器会做部署的东西。

    【讨论】:

      猜你喜欢
      • 2013-05-11
      • 1970-01-01
      • 2012-07-08
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多