【问题标题】:Maven assembly: generate a resource zip file and include it into the main assembly zip fileMaven 程序集:生成资源 zip 文件并将其包含到主程序集 zip 文件中
【发布时间】:2016-11-06 07:50:59
【问题描述】:

如何继续使用 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>

assembly-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 maven-assembly-plugin


    【解决方案1】:

    不要两次声明插件;相反,您需要声明 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>
    

    几点说明:

    • &lt;finalName&gt; 不应包含扩展名,因此 folderAfinalName 将在 ZIP 组装完成后生成存档 folderA.zip
    • 第一个程序集将在构建目录中创建,默认为target。因此,第二个需要在那里引用它:

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

      在它的程序集描述符中。

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

    • descriptor 是一个已弃用的参数,您应该改用 descriptors

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

    【讨论】:

    • 关于 finalName 这是一个错误的复制粘贴:-) 顺便说一句,我已经应用了你的解决方案,但我得到了Error reading assemblies: No assembly descriptors found :-/
    • @gudepier 好吧,assembly-zipFolderA.xmlassembly.xml 都存在吗?我在本地使用示例文件进行了测试,没有问题。根据您的帖子(在 POM 旁边),它们应该位于 basedir。
    • 是的,两者都存在,关闭我的 pom.xml;如果不支持破折号,我什至更改了文件拼写,但我得到了相同的...
    • @gudepier 你是如何启动 Maven 的?您应该启动 mvn clean package 以获得结果。如果您使用的是mvn assembly:single,则预计会出现错误。
    • 我的主 pom 是问题所在,它已经定义了一个执行块,现在它工作得更好>_> thks
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2011-12-12
    相关资源
    最近更新 更多