Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不继承的情况下执行Maven3 exec插件_Java_Maven_Exec - Fatal编程技术网

Java 在不继承的情况下执行Maven3 exec插件

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

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

我在父POM上调用maven 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>

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。