Java 在不继承的情况下执行Maven3 exec插件
我有一个多模块maven java项目,我想在其中执行exec插件,以便在创建JAR后执行自定义命令 我在父POM上调用maven package assembly:assembly exec:exec来创建项目输出 我在父POM中使用了以下内容:Java 在不继承的情况下执行Maven3 exec插件,java,maven,exec,Java,Maven,Exec,我有一个多模块maven java项目,我想在其中执行exec插件,以便在创建JAR后执行自定义命令 我在父POM上调用maven package assembly:assembly exec:exec来创建项目输出 我在父POM中使用了以下内容: <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</a
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<configuration>
<executable>myExecutable.exe</executable>
<workingDirectory>${basedir}</workingDirectory>
<arguments>....</arguments>
</configuration>
</plugin>
org.codehaus.mojo
execmaven插件
myExecutable.exe
${basedir}
....
执行此操作时,我的可执行文件得到了正确执行,但也对每个子模块执行
为了尝试修复它,我将插件设置为不继承子模块:
<inherited>false</inherited>
false
但是现在exec插件失败了,出现了一个错误,目标org.codehaus.mojo:exec maven plugin:1.2.1:exec的参数“executable”丢失或无效
我尝试将插件设置为在“executions”元素下运行,并将其分配给maven生命周期阶段。这导致可执行文件成功运行,但我无法这样做,因为我需要在执行这个exec插件之前执行其他插件(汇编插件)
我如何在包阶段完成并且其他插件(程序集)也完成之后运行这个(exec)插件一次
换句话说,我希望为所有子模块执行“package”,然后从父模块只执行一次exec插件
非常感谢您的帮助。当您在父POM级别运行命令时,您告诉Maven为每个模块调用生命周期的这一部分 如果您只想为子模块调用exec:exec,则应仅为子模块声明该插件(因为它对继承父模块的其他模块没有意义),并使用
--projects
或-pl
参数调用Maven:
mvn-pl子包程序集:程序集执行:执行
当从父项目执行此命令时,仅对子项目执行包assembly:assembly exec:exec
但是,如果您真正想要完成的是可以在一个命令中打包
所有模块,并且希望在打包
阶段为该子模块执行组装:组装
和执行:执行
目标,那么。例如:
<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>
org.codehaus.mojo
execmaven插件
myExecutable.exe
${basedir}
....
包裹
执行官
这将跳过先前配置的执行的继承:
<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>
org.codehaus.mojo
execmaven插件
没有一个
...
非常感谢您的详细回答,我想我可能还不够清楚。我希望在所有子模块执行“打包”阶段后,exec插件在父模块上运行。换句话说,我想为我的所有子模块执行一个包,然后只执行一次exec插件。我不希望插件在任何子模块上运行。您可以将assembly和exec插件绑定到集成测试
阶段,或在软件包
之后但在安装
之前发生的类似阶段。要让assembly插件在exec插件之前执行,可以选择assembly的前一个阶段,而不是exec,或者将它们绑定到同一个阶段,但首先列出程序集(pom.xml中列出的顺序对类似内容很重要)。我能问一下将要执行的程序会做什么吗?了解它的本质可能有助于理解实现您所寻找目标的最佳方式,或者弄清楚它是否完全符合Maven的想法。它是某种集成测试,还是检查打包输出的有效性的东西?我不能将它绑定到后面的阶段,比如“集成测试”,因为我有一些集成测试在那个阶段运行,我并不总是想运行。我正在运行一个使用“exec”插件的WIX项目。wix项目正在从我的项目的输出创建一个MSI。听起来像是要开始的一种集成测试?不。我正在执行一个wix项目,以便从我所有项目的输出创建一个MSI。