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

Java 在多模块反应堆项目的子模块中从命令行运行特定的Maven插件目标,java,maven,Java,Maven,我在这里寻找一种通用技术,但让我们给出一个具体的例子。我有一个多模块项目,我想从命令行对项目的一个子模块运行exec:java目标 我知道一种方法是,我可以在整个项目上运行mvn install,然后进入子模块目录,从命令行运行exec:java命令,并将工件解析到本地存储库。但是一直运行mvn install会变得非常乏味 我真正想要的是能够对Maven reactor运行exec:java,其中类路径是从Maven reactor中项目的活动模块构建的。问题是我不确定这是否可行。一种简单的方

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

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

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

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

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

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

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

依赖项解析实际上是通过本地存储库完成的

我真正想要的是能够对Maven reactor运行
exec:java
,其中类路径是从Maven reactor中项目的活动模块构建的

这并不是反应堆的真正功能。反应器构建构建模块的定向图,从该图导出适当的构建顺序,并按照计算的顺序针对模块运行目标/阶段。反应堆构建不会构造一些“全局”类路径

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

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

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


反应堆的建造确实允许这样做,但正如我所写的,你似乎在寻找不同的东西。如果您明确您的确切需求,我可能会提供一个更好的答案。

在这种情况下,我使用的一种比较通用的技术是在所讨论的子模块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>                                                                                                                     
这将像往常一样设置模块间类路径,并尝试在所有子项目中运行测试java概要文件。但是,由于只有您关心的一个配置文件已定义,因此它是唯一可以执行任何操作的配置文件

Maven确实需要一点额外的时间来完成你的其他子项目,但也没那么糟糕


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

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

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

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

带有
exec:exec
目标配置的
exec-maven插件的示例:

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

org.codehaus.mojo
execmaven插件
1.3.2
真的
JAVA

org.codehaus.mojo
execmaven插件
假的

这是第一个也是唯一一个在不诉诸丑陋的黑客手段的情况下真正对我有效的答案。如果使用exec:java,请删除父级
pom.xml
中的
标记,并添加
none
以抑制错误消息。我希望这个答案更加突出。这是最不“黑”的方式,真的很有效。谢谢,这就是我想要的:
<!-- 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>