Maven程序集:生成资源zip文件并将其包含在主程序集zip文件中

时间:2016-07-04 14:29:36

标签: maven maven-assembly-plugin

如何使用Maven Assembly插件将生成的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>
使用此配置

===&gt; ,Maven抱怨它无法找到 folderA.zip ...

1 个答案:

答案 0 :(得分: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>不应包含扩展程序,因此finalName folderA将在完成ZIP程序集后生成存档folderA.zip
  • 第一个程序集将在构建目录中创建,默认情况下为target。因此,第二个需要在那里引用它:

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

    在其汇编描述符中。

  • 由于第一次装配不是最后一次装配,您可能不希望它附加,即作为项目产生的附加工件。您可以将attach设置为false来停用此功能。这将确保在部署或发布时仅考虑最后一个最终版本。

  • descriptor是不推荐使用的参数,您应该使用descriptors代替。

使用这样的配置,运行mvn clean package将在构建文件夹中生成正确的存档。