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

gud*_*ier 3 maven maven-assembly-plugin

如何使用 Maven Assembly 插件将生成的 zip 文件包含到zip 文件中?

例如,我有以下文件夹结构:

./folderA/
./file1
Run Code Online (Sandbox Code Playgroud)

我想生成一个 zip 文件,其中的内容是这样的:

folderA.zip
file1
Run Code Online (Sandbox Code Playgroud)

这是我的简化配置':

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>
Run Code Online (Sandbox Code Playgroud)

程序集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>
Run Code Online (Sandbox Code Playgroud)

程序集.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>
Run Code Online (Sandbox Code Playgroud)

===>使用这个配置,Maven 抱怨它找不到folderA.zip ...

Tun*_*aki 6

不要两次声明插件;相反,您需要声明maven-assembly-plugin.

第一次执行将创建第一个程序集,然后第二次执行将使用此程序集创建最后一个程序集。这两个执行都将绑定到package阶段,Maven 将按照 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>
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  • <finalName>不应包含扩展,这样finalNamefolderA会产生归档folderA.zip的ZIP组件制成后。
  • 第一个程序集将在 build 目录中创建target,默认情况下。因此,第二个需要在那里引用它:

    <file>
        <source>${project.build.directory}/folderA.zip</source>
    </file>
    
    Run Code Online (Sandbox Code Playgroud)

    在其程序集描述符中。

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

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

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