【问题标题】:Executing Maven3 exec plugin with no inheritance执行没有继承的Maven exec插件
【发布时间】:2013-05-30 23:32:04
【问题描述】:

我有一个多模块 maven java 项目,我想在其中执行 exec 插件,以便在创建 Jars 后执行自定义命令。

我在父 POM 上调用 ma​​ven package assembly:assembly exec:exec 来创建项目输出。

我在父 POM 中使用了以下内容:

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <configuration>
            <executable>myExecutable.exe</executable>
            <workingDirectory>${basedir}</workingDirectory>
            <arguments>....</arguments>
        </configuration>
    </plugin>

这样做时,我的可执行文件被正确执行,但也为每个子模块执行。

为了尝试修复它,我已将插件设置为不继承子模块:

<inherited>false</inherited>

但现在 exec 插件失败并出现 The parameters 'executable' for goal org.codehaus.mojo:exec-maven-plugin:1.2.1:exec is missing or invalid 错误。 p>

我尝试将插件设置为在“executions”元素下运行,并将其分配给 maven 生命周期阶段。这导致可执行文件成功运行,但我无法执行此操作,因为我需要在执行此 exec 插件之前执行其他插件(程序集插件)。

如何在打包阶段完成并且另一个插件(程序集)也完成后只运行一次这个(exec)插件?

换句话说,我想为我的所有子模块执行“包”,然后只从父模块执行一次 exec 插件。

我将不胜感激。

【问题讨论】:

  • 听起来像是一种你想开始的集成测试?
  • 没有。我正在执行一个 WIX 项目,以便从我所有项目的输出中构建一个 MSI。

标签: java maven exec


【解决方案1】:

当您在父 POM 级别运行命令时,您是在告诉 Maven 为每个模块调用生命周期的该部分

如果您只想为子模块调用 exec:exec,您应该只为子模块声明该插件(因为它对继承父模块的其他模块没有意义)并使用 --projects-pl 论据:

mvn -pl 子包程序集:程序集 exec:exec

从父项目执行此命令时,仅对子项目执行package assembly:assembly exec:exec

但是,如果您真正想要完成的是您可以在单个命令中 package 所有模块,并且您希望 assembly:assemblyexec:exec 目标成为在package 阶段为该子模块执行,然后在you want to bind these plugins to that phase 执行。例如:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <configuration>
        <executable>myExecutable.exe</executable>
        <workingDirectory>${basedir}</workingDirectory>
        <arguments>....</arguments>
    </configuration>
    <executions>
        <!-- run the exec goal of this plugin every time this module is packaged -->
        <execution>
            <phase>package</phase>
            <goals><goal>exec</goal></goals>
        </execution>
    </executions>
</plugin>

【讨论】:

  • 非常感谢您的详细回答,我想我可能还不够清楚。我希望 exec 插件在所有子模块执行“包”阶段后在父模块上运行。换句话说,我想为我的所有子模块执行一个包,然后只执行一次 exec 插件。我不希望插件在任何子模块上运行。
  • 您也许可以将程序集和执行插件绑定到integration-test 阶段或发生在package 之后但install 之前的类似阶段。要让程序集插件在 exec 插件之前执行,请选择比 exec 更早的程序集阶段,或者将它们绑定到同一阶段但首先列出程序集(pom.xml 中列出的顺序对于类似的东西很重要)。 maven.apache.org/guides/introduction/…
  • 我能问一下将要执行的程序会做什么吗?了解它的本质可能有助于了解完成您正在寻找的东西的最佳方式,或者弄清楚它是否完全符合 Maven 的想法。是某种集成测试,还是检查打包输出的有效性?
  • 我无法将它绑定到像“集成测试”这样的后期阶段,因为我在该阶段运行了一些我并不总是想要运行的集成测试。我正在使用“exec”插件运行一个 WIX 项目。 wix 项目正在从我的项目的输出中创建一个 MSI。
【解决方案2】:

这将跳过先前配置的exec-maven-plugin 执行的继承:

<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <executions>
          <execution>
            <phase>none</phase>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </pluginManagement>
  ...
</build>

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多