maven - 如何仅在结果输出尚不存在时运行 Maven 插件执行

标签 maven

我继承了一个 POM,它试图通过使用配置文件来避免重复构建步骤 仅当步骤输出不存在时才会激活:

<profile>
 <id>run-once</id>
  <activation>
    <file>
     <missing>target/some-output</missing>
    </file>
  </activation>
  <build>
   <plugins>
    <plugin>
     ...
     <executions>
      <execution>
       ... slow process to produce target/some-output ...
      </execution>
     </executions>
    </plugin>
   </plugins>
  </build>
 </activation>

然而,正如 maven 专家无疑立即意识到的那样,如果开发人员说 mvn clean install,这将不起作用。 Maven 在运行 clean 之前计算一次事件配置文件,如果存在 target/some-output,则 run-once 配置文件不存在积极的。结果是 target/some-output 被清除阶段删除但没有在 install 阶段重新创建,随后的 WAR 被破坏,因为 some-缺少输出

这个问题是否有标准的解决方案(除了避免mvn clean install)?我打算让插件成为无条件的,以防止静默创建损坏的 WAR。

更一般地说,是否有一种标准技术可以防止 mvn 重新创建像 some-output 这样的最新 Artifact ?或者如果 make 风格的依赖管理很重要,那么应该使用 gradle 或 rake 而不是 maven 的想法是什么?

最佳答案

我认为这个问题没有标准的解决方案。尽管我可以想到多种选择(很可能还有其他选择):

  • 您显然可以手动激活配置文件:mvn clean install -Prun-once,但是当然您必须记住每次都这样做
  • 配置maven-enforcer-plugin连同它的requireFilesExist规则以确保文件存在,如果不存在则构建失败。 (至少这样你就不会静默地创建一个失败的 WAR)
  • 修改配置文件,让它创建文件到您的 src 文件夹下的某个位置(即 src/main/gen),该位置被排除在您的源代码之外存储库(如果您正在使用一个),然后配置 maven-resources-plugin及其 copy-resources目标是将这些资源复制到构建目录下的正确位置。这样就不会删除它们。

关于maven - 如何仅在结果输出尚不存在时运行 Maven 插件执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26369232/

相关文章:

java - maven tomcat7 :deploy fails with status code:403, ReasonPhrase:Forbidden

java - 许多 jar 库版本兼容性

java - 是否有针对 maven-javadoc-plugin 错误 MJAVADOC-414 的解决方法?

java - 将文件上传到 webapp 文件夹中

java - JaCoCo 未根据源文件生成覆盖率报告 - 方法名称不可点击

java - Maven:使用响应 Java EE 部署 HTML 表单页面,并使用 POST 打印结果

java - AspectJ 不是在测试编译时编织而是在编译时编织。因此,单元测试在使用 Maven 运行时会抛出 ClassNotFoundException

java - 用于从托管项目加载类的 Maven mojo 插件

java - 即使将依赖项添加到 pom.xml 也会发生 NoClassDefFoundError

android - Roboelectic Maven Build 中的 "ant maven-setup"是什么意思?