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

时间:2010-08-11 15:18:20

标签: maven maven-2

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

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

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

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

4 个答案:

答案 0 :(得分:34)

  

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

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

mvn exec:java -pl my-module
  

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

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

  

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

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

  

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

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

  

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

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

答案 1 :(得分:17)

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

许多插件都有skip选项,您可以通过将其值设置为true来激活根项目。默认情况下,对于所有子模块,将跳过插件执行。应该执行插件的子模块可以明确地将skip设置为false。您仍需要在根项目中配置任何非可选属性。

包含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>
<!-- 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>

答案 2 :(得分:5)

我在这种情况下使用的一种通用技术是在子模块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>                                                                                                                     

然后从项目的顶部开始运行:

mvn test -Ptest-java

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

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

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

答案 3 :(得分:1)

帕斯卡的建议可能就是你想要的。请注意,目前无法首先编译依赖项,然后在单个Maven命令中运行(exec:exec等)应用程序:https://jira.codehaus.org/browse/MNG-5059