2010-08-11 60 views
26

我在這裏找一個普通技術的子模塊中的命令行特定的Maven插件目標,但讓我們給一個具體的例子。我有一個多模塊項目,我想從命令行鍼對我的項目的一個子模塊運行exec:java目標。運行從一個多模塊反應堆項目

我知道一種方法是,我可以在整個項目上運行mvn install,然後進入子模塊目錄,從命令行運行exec:java命令,並將工件解析到本地存儲庫。但一直運行mvn install變得非常乏味。

我真的很喜歡對Maven反應器運行exec:java的能力,其中classpath由Maven反應器中項目的活動模塊構建而成。問題是我不確定這是可能的。一個天真的做法是從項目的根目錄運行exec:java目標,但是這會嘗試針對項目中的每個模塊運行插件,而不是我感興趣的目標模塊。

任何想法?我知道我的激勵的例子是exec:java,但確實有一些的,我想對我的項目從時間全力打造生命週期的範圍之外運行時間單插件的目標。

回答

26

我有一個多模塊項目,我想運行在命令行exec:java插件對我的項目的子模塊之一。

我不說,這將滿足您的實際使用情況,但它可以運行在多模塊的子集的目標使用-pl, --projects <arg>選項編譯:

mvn exec:java -pl my-module 

我知道一種方法是我可以在整個項目上運行「mvn install」,然後進入子模塊目錄,從命令行運行exec:java命令,並將工件解析到本地存儲庫。

相關決議通過本地倉庫的確做到了。

我真的很希望能夠對Maven反應器運行exec:java,其中classpath是從Maven反應器中項目的活動模塊構建的。

這不是一個真正的編譯器做什麼。反應器構建構建模塊的定向圖,從該圖推導出適當的構建順序,並按計算順序針對模塊運行目標/階段。反應堆構建不構建一些「全局」類路徑。

天真的方法是運行從項目的根exec:java目標,但這種嘗試運行對項目中的每個模塊插件,而不是目標模塊我感興趣的

好了,這是預期的行爲。這似乎並不是你真正想要的。

任何想法?我知道我的激勵範例是exec:java,但實際上有很多單個插件的目標,我希望在整個構建生命週期的範圍之外不時運行我的項目。

A反應堆的構建確實允許這樣做,但正如我寫的,你似乎在尋找不同的東西。也許如果你明確你的確切需求,我將能夠提供更好的答案。

4

我在這種情況下使用的一種有點通用的技術是在子模塊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 

這將設置模塊間的類路徑和往常一樣,並嘗試運行在所有的測試Java的配置文件你的子項目。但是由於只有你關心的人員定義了個人資料,這是唯一能夠做任何事情的人。

Maven花費了一點時間來研究其他子項目NOOPing,但並沒有那麼糟糕。

需要注意的一件事是,子項目以頂級目錄作爲當前工作目錄(而不是子項目目錄)運行。解決這個問題的方法並不多,但希望這不會給你帶來麻煩。

8

還有一種方法可讓您選擇多個模塊來執行插件。

許多插件都有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

這是一個真正爲我工作,而不訴諸醜陋的黑客第一個也是唯一的答案。如果您使用exec:java,請刪除父'pom.xml'中的''標記並添加''來抑制錯誤消息。 – Jodiug 2017-03-20 12:37:39

+2

我希望這個答案更突出。這是最不「哈克」的方式,真的有用。 – Alexandros 2017-08-01 18:13:25