2017-12-03 54 views
0

我有以下結構的多模塊Maven項目:如何使用Maven的聚集和繼承來收集子模塊罐子爲母公司的壓縮包

root module 
      module A 
      module B 
      module C 
        module C-1 
        module C-2 

模塊C在這個項目是新的。其目標是爲子模塊C-1和C-2(即對其爲親本)和集合定義模塊C-1和C-2構建成單個焦油球的共享依存關係模塊的C target目錄。

這個目標是實現:

  • pom.xml列表模塊A,B,和C
  • 模塊C pom.xml列表模塊C-1和C-2,並聲明共享依賴性;它還聲明包裝爲「pom」
  • maven-assembly-plugin在模塊C中用於查找其子目錄target中的所有*.jar文件並將它們打包到tgz中。

我在這個實現中遇到了一些問題。簡單的一個是C-1和C-2的自我依賴 - 它們從C繼承了它自己的依賴,因此拒絕編譯。我在C中使用dependencyManagement來解決這個包裝依賴問題。看起來它工作正常。

我也對Assembly插件有問題。當在文件集值中使用通配符時,它會保留結果tar文件夾中的目錄結構,看起來你無法做任何事情。因此,具有模塊C的bin.xml

<fileSet> 
     <directory>${project.basedir}</directory> 
     <outputDirectory>/</outputDirectory> 
     <includes> 
      <include>**/*.jar</include> 
     </includes> 
     <excludes> 
      <exclude>**/*-javadoc.jar</exclude> 
     </excludes> 

    </fileSet> 

結果按照壓縮包了一種具有結構

moduleC-version/moduleC-1/target/moduleC-1-version.jar 
moduleC-version/moduleC-2/target/moduleC-2-version.jar 

時,我只需要

moduleC-version/moduleC-1-version.jar 
moduleC-version/moduleC-2-version.jar 

歐凱,這不是太重要。主要問題是反應堆建造順序。無論我做什麼它導致

  1. 模塊A
  2. 模塊B
  3. 模塊C
  4. 模塊C-1
  5. 模塊C-2

這是因爲構建失敗在模塊C上抱怨

創建程序集失敗:創建程序集歸檔bin時出錯:您必須至少設置一個文件。 - > [Help 1]

我的理解是,問題出現在反應堆構建順序 - C-1和C-2應該在C之前構建 - 但我無法得到如何管理它有C父母給他們,並保持在模塊結構的頂部。

+0

最重要的部分是有一個單獨的模塊(dist),它包含maven-assembly-plugin的配置。在那裏你需要定義你想要打包的所有模塊作爲依賴關係,以確保每個依賴項都是在模塊dist之前構建的。此外,使用像[this]這樣的描述符(https://github.com/khmarbaise/assembly-examples/blob/master/assemblies-with-reactor/dist/proj1-assembly.xml)和像[this]這樣的結構(https: //github.com/khmarbaise/assembly-examples/tree/master/assemblies-with-reactor)。 – khmarbaise

+0

@khmarbaise謝謝,這是一個選項,爲什麼你不把它作爲答案在這裏?儘管在這個例子中看起來像dist/pom.xml並不需要顯式列出所有的依賴關係 - Reactor會尊重你列出模塊的順序,所以你只需要把dist放在最後並擺脫依賴關係。 –

+0

我強烈建議將你想要打包的模塊定義爲'dist/pom.xml'中的依賴關係,否則,如果因爲任何原因(合併/更改/添加新模塊)而更改模塊的順序,則構建將失敗。 。 – khmarbaise

回答

1

如果你需要有一個像包一樣的發行包(例如zip),你必須定義一個包含它的配置的獨立模塊。 此外,您需要將每個您想要打包的模塊定義爲依賴項,以確保構建順序由maven正確完成。

你必須使用看起來像this:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 

    <id>dist-assembly</id> 

    <formats> 
     <format>zip</format> 
    </formats> 

    <includeBaseDirectory>false</includeBaseDirectory> 

    <dependencySets> 
     <dependencySet> 
      <outputDirectory>/</outputDirectory> 
      <useProjectArtifact>false</useProjectArtifact> 
      <unpack>false</unpack> 
      <scope>runtime</scope> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

項目的結構看起來更或類似this:

+- pom.xml 
+-- mod1 
+-- mod2 
+-- dist 

更新的Maven的組裝插件描述:

如果您只需要你可以作爲組件描述符的模塊來代替:

<moduleSets> 
    <moduleSet> 
     <useAllReactorProjects>true</useAllReactorProjects> 
     <binaries> 
     <outputDirectory>modules</outputDirectory> 
     <unpack>false</unpack> 
     </binaries> 
    </moduleSet> 
</moduleSets> 
+0

你對於列表依賴關係也是對的 - Reactor根據模塊序列只做了很好的事情**除非**我在多線程模式下運行它。那麼分配項目可能確實發生在依賴關係之前。儘管如此,我仍然不得不維護兩個子項目列表 - 一個是作爲分佈pom中的依賴項,另一個是作爲聚合pom中的模塊列表。如果可能的話,只想保留一個。 –

+0

不應該使用模塊序列,因爲它不可靠。定義模塊之間的正確依賴關係。它會一直工作...另外萬一你正在使用多線程運行...(mvn -T ...) – khmarbaise