2017-07-20 28 views
1

我在想這是否構建我的項目的正確方法,以及如何配置它以便我可以從單個項目構建/測試/打包所有單個組件建立命令?如何在Maven中組織一個包含共享庫的項目

我有一個Maven項目,其中包含多個模塊 - Spring應用程序和它們之間共享的「庫」作爲依賴項。我希望能夠與庫一起構建所有應用程序,以便在任何模塊更改(lib或app)時執行集成測試。理想情況下,我應該能夠編譯每個組件,爲每個應用程序/庫運行單元測試,運行集成測試,將每個組件打包到其可執行的jar文件中。在某些時候,這個過程將在具有更高級別系統測試的Jenkins服務器上運行。我正在使用mvn clean install spring-boot:repackage。這適用於每個應用程序,即,當從Main Project/App1/運行。但是,當我從項目根目錄Main Project/運行它時,出現一個錯誤,即該庫不能被重新打包,因爲該庫沒有主類。這很好 - 它是一個庫,它不需要入口點。

那麼這是在Maven中構建多應用程序項目的正確方法,還是我在做一些非常錯誤的事情?

這個項目的結構:

Main Project 
|-SharedLibrary/ 
    |-src/ 
    |-pom.xml 
|-App1/ 
    |-src/ 
    |-pom.xml 
|-App2/ 
    |-src/ 
    |-pom.xml 
|-App3/ 
    |-src/ 
    |-pom.xml 
|-pom.xml 
+0

您是否已將應用程序添加爲主項目pom中的模塊? – Christian

+0

嗨Christian,是的,當我對主項目執行'mvn clean install'時,所有的測試都會運行。但是,只有庫文件可以正確構建,因爲所有其他文件都需要使用'mvn clean install spring-boot:repackage'構建。 –

回答

1

而不是運行在命令行上的目標,可以考慮增加配置爲Spring Boot maven plugin repackage goal的多金屬氧酸鹽。如果添加配置,則重新打包將作爲mvn clean install命令的一部分運行。

首先,將該插件添加到pluginManagement部分中父級的POM中。這將確保Spring引導的版本對所有模塊都是一致的。

<pluginMangement> 
    <plugins> 
    <plugin> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-maven-plugin</artifactId> 
     <version>YourSpringBootVersion</version> 
    </plugin> 
    </plugins> 
</pluginMangement> 

然後將repackage的目標添加到Spring Boot模塊的POM中。根據文檔,該目標默認情況下會與階段package相關聯。

<plugins> 
    <plugin> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>spring-boot-repackage</id> 
     <goals> 
      <goal>repackage</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
</plugins> 

可替換地,由於應用程序是在4個模塊的3使用repackage,可以添加上述對於親本配置。但是,這樣做會執行所有模塊的插件目標,我們知道這些模塊無法工作。所以,如果你選擇了這個選項,那麼你需要告訴插件到庫運行:

<plugins> 
    <plugin> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>spring-boot-repackage</id> 
     <phase>none</phase> 
     <goals> 
      <goal>repackage</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
</plugins> 

注意添加<phase>none</phase>的。這隻會禁用此模塊的插件目標。

+0

這完全解決了我的問題 - 我知道我正在嘗試做一些非常簡單的事情。 我選擇了爲每個組件在其自己的pom中分別指定構建過程的方法,而不是假設每個組件都將以相同方式構建。理由是構建過程目前並不十分複雜,並且不會像源或依賴那樣經常迭代。 即,可以告訴maven「去建立我的項目」,然後每個工件負責指定它應該如何構建。 –

相關問題