在多模块reactor项目的子模块中从命令行运行特定的Maven插件目标

Bri*_*ris 34 java maven

我在这里寻找一种通用技术,但让我们举一个具体的例子.我有一个多模块项目,我想exec:java从命令行对我的项目的一个子模块运行目标.

我知道一种方法是我可以mvn install在整个项目上运行,然后进入子模块目录,从命令行运行exec:java命令,并将工件解析到我的本地存储库.但是一直运行mvn install变得相当繁琐.

我真正喜欢的是能够exec:java对Maven反应堆运行,其中类路径是从Maven反应器中项目的活动模块构建的.问题是我不确定这是可能的.一种天真的方法是exec:java从项目的根目录运行目标,但这会尝试针对项目中的每个模块运行插件,而不是我感兴趣的目标模块.

任何的想法?我知道我的动机示例是exec:java,但实际上有很多单个插件目标,我想在整个构建生命周期的范围之外不时地针对我的项目运行.

Pas*_*ent 38

我有一个多模块项目,我想exec:java从命令行对我的项目的一个子模块运行插件.

我不是说这将适合您的确切用例,但可以使用以下-pl, --projects <arg>选项在多模块构建的子集上运行目标:

mvn exec:java -pl my-module
Run Code Online (Sandbox Code Playgroud)

我知道一种方法是我可以在整个项目中运行"mvn install",然后进入子模块目录,从命令行运行exec:java命令,并将工件解析到我的本地存储库.

依赖性解析确实是通过本地存储库完成的.

我真正喜欢的是能够exec:java对Maven反应堆运行,其中类路径是从Maven反应器中项目的活动模块构建的.

这不是反应堆构建的真正含义.reactor构建构建模块的方向图,从该图中导出适当的构建顺序,并以计算的顺序对模块运行目标/阶段.反应器构建不构造一些"全局"类路径.

一种天真的方法是exec:java从项目的根目录运行目标,但这会尝试针对项目中的每个模块运行插件,而不是我感兴趣的目标模块.

嗯,这是预期的行为.它似乎并不是你真正想要的.

任何的想法?我知道我的激励示例是exec:java,但实际上有很多单个插件目标我不时会在完整构建生命周期的范围之外针对我的项目运行

反应堆构建确实允许这样做,但正如我所写,你似乎在寻找不同的东西.也许如果你澄清你的确切需求,我将能够提供更好的答案.


kap*_*pex 20

还有另一种方法可以让您选择多个模块来执行插件.

许多插件都有一个skip选项,您可以通过将其值设置为在根项目上激活该选项true.默认情况下,对于所有子模块,将跳过插件执行.应该执行插件的子模块可以显式设置skipfalse.您仍然需要在根项目中配置任何非可选属性.

目标exec-maven-plugin配置示例exec:exec:

<!-- root project -->
<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <skip>true</skip>
                    <executable>java</executable>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
Run Code Online (Sandbox Code Playgroud)
<!-- any module that should execute the plugin -->
<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <configuration>
                <skip>false</skip>
                <!-- ... -->
            </configuration>
        </plugin>
   </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

  • 这是第一个也是唯一一个真正适合我而不诉诸丑陋黑客的答案.如果你使用exec:java,删除父`pom.xml`中的`<executable>`标签,并添加`<mainClass> none </ mainClass>`来抑制错误信息. (5认同)
  • I wish this answer was more prominent. It's the least 'hacky' way and really works. (4认同)

sam*_*ert 6

我在这种情况下使用的一种通用技术是在子模块POM中定义一个将exec:java绑定到测试阶段的配置文件.例如:

<profiles>                                                                                                                      
  <profile>                                                                                                                     
    <id>test-java</id>                                                                                                          
    <build>                                                                                                                     
      <plugins>                                                                                                                 
        <plugin>                                                                                                                
          <groupId>org.codehaus.mojo</groupId>                                                                                  
          <artifactId>exec-maven-plugin</artifactId>                                                                            
          <version>1.1.1</version>                                                                                              
          <executions>                                                                                                          
            <execution>                                                                                                         
              <phase>test</phase>                                                                                               
              <goals>                                                                                                           
                <goal>java</goal>                                                                                               
              </goals>                                                                                                          
              <configuration>                                                                                                   
                <mainClass>com.foo.bar.MyClass</mainClass>                                                                      
              </configuration>                                                                                                  
            </execution>                                                                                                        
          </executions>                                                                                                         
        </plugin>                                                                                                               
      </plugins>                                                                                                                
    </build>                                                                                                                    
  </profile>                                                                                                                    
</profiles>                                                                                                                     
Run Code Online (Sandbox Code Playgroud)

然后从项目的顶部运行:

mvn test -Ptest-java
Run Code Online (Sandbox Code Playgroud)

这将像往常一样设置模块间类路径,并尝试在所有子项目中运行test-java配置文件.但是,因为只有你关心的人才定义了个人资料,所以这是唯一一个可以做任何事情的人.

Maven需要花费一点额外的时间来磨练你的其他子项目NOOPing,但这并不是那么糟糕.

需要注意的一点是,子项目是以顶级目录作为当前工作目录(而不是子项目目录)运行的.你无法解决这个问题,但希望这不会给你带来麻烦.