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 ...
不要两次声明插件;相反,您需要声明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>不应包含扩展,这样finalName的folderA会产生归档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将在构建文件夹中生成正确的存档。