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

Maven assembly: generate a resource zip file and include it into the main assembly zip file

如何使用 Maven Assembly 插件将生成的 zip 文件包含到 main 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...

不要声明插件两次;相反,您需要声明 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> 不应包含扩展名,因此 folderAfinalName 将在制作 ZIP 程序集后生成存档 folderA.zip
  • 第一个程序集将在构建目录中创建,默认情况下为 target。因此,第二个需要在那里引用它:

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

    在其程序集描述符中。

  • 由于第一个程序集不是最后一个程序集,您可能不希望附加它,即作为项目产生的附加工件。您可以通过将 attach 设置为 false 来禁用此功能。这将确保在部署或发布时只考虑最后一个。

  • descriptor is a deprecated parameter, you should use descriptors 代替。

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