2016-07-04 48 views
1

如何繼續使用Maven Assembly插件將生成的zip文件包含到主文件夾中的 zip文件中?Maven程序集:生成資源zip文件並將其包含在主程序集zip文件中

例如,我有以下文件夾結構:

./folderA/ 
./file1 

,我想生成一個zip文件,其中的內容是這樣的:

folderA.zip 
file1 

這裏我簡單的配置':

pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project > 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <configuration> 
        <appendAssemblyId>false</appendAssemblyId> 
        <descriptor>${basedir}/assembly-zipFolderA.xml</descriptor> 
        <finalName>folderA.zip</finalName> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <configuration> 
        <appendAssemblyId>false</appendAssemblyId> 
        <descriptor>${basedir}/assembly.xml</descriptor> 
        <finalName>${module-zipFinalName}</finalName> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

組裝zipFolderA.xml

<assembly> 
    <id>folderA-zip</id> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <formats> 
     <format>zip</format> 
    </formats> 

    <fileSets> 
     <fileSet> 
      <directory>folderA</directory> 
      <outputDirectory>/</outputDirectory> 
     </fileSet> 
    </fileSets> 
</assembly> 

assembly.xml

<assembly> 
    <id>main</id> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <formats> 
     <format>zip</format> 
    </formats> 

    <files> 
     <file> 
      <source>file1</source> 
     </file> 
     <file> 
      <source>folderA.zip</source> 
     </file> 
    </files> 
</assembly> 

===>用這個配置,Maven的抱怨說,它找不到folderA.zip ...

回答

2

不要聲明插件兩次;相反,您需要聲明maven-assembly-plugin的兩次執行。

第一次執行會創建第一個程序集,然後第二次執行將使用此程序集創建最後一個。這兩個執行都將被綁定到package階段,Maven將調用插件的執行in the order of declaration in the POM

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.6</version> 
    <executions> 
     <execution> 
      <id>make-folderA</id> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <phase>package</phase> 
      <configuration> 
       <appendAssemblyId>false</appendAssemblyId> 
       <descriptors> 
        <descriptor>${basedir}/assembly-zipFolderA.xml</descriptor> 
       </descriptors> 
       <finalName>folderA</finalName> <!-- name without extension --> 
       <attach>false</attach> 
      </configuration> 
     </execution> 
     <execution> 
      <id>make-assembly</id> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <phase>package</phase> 
      <configuration> 
       <appendAssemblyId>false</appendAssemblyId> 
       <descriptors> 
        <descriptor>${basedir}/assembly.xml</descriptor> 
       </descriptors> 
       <finalName>${module-zipFinalName}</finalName> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

有兩點要注意:

  • <finalName>不應包含擴展,所以folderA一個finalName會產生歸檔folderA.zip的ZIP組件製成後。
  • 第一個程序集將在build目錄下創建,默認爲target。因此,第二個需要在那裏引用它:

    <file> 
        <source>${project.build.directory}/folderA.zip</source> 
    </file> 
    

    在其裝配描述符中。

  • 由於第一個程序集不是最終的程序集,因此您可能不希望將其附加,即作爲項目生成的附加工件。您可以通過將attach設置爲false來禁用此功能。這將確保在部署或釋放時只考慮最後一個最後一個。

  • descriptor是不建議使用的參數,您應該改用descriptors

使用這樣的配置,運行mvn clean package將生成構建文件夾內的正確存檔。

+0

關於finalName這是一個錯誤的複製粘貼:-) 順便說一句我申請您的解決方案,但我得到 '讀取錯誤組件:沒有裝配描述found' : -/ – gudepier

+0

@gudepier好,一舉兩得' assembly-zipFolderA.xml'和'assembly.xml'存在嗎?我本地測試了示例文件,沒有問題。根據您的帖子(POM旁邊),他們應該位於basedir上。 – Tunaki

+0

是的,兩者都很好地關閉了我的pom.xml;我甚至改變了文件拼寫的情況下破折號不支持,但我得到相同的... – gudepier

相關問題