如何使用 Maven 程序集插件在 tar 中创建和包含一个 zip 文件

How to create and include a zip file inside a tar using maven assembly plugin

我有一个项目使用 Maven 程序集插件将一堆文件包含到 tar 中。现在我想在 tar 中包含更多文件,但首先我想将它们压缩并实际包含该 zip 文件。

我试过这样做:maven-assembly plugin - how to create nested assemblies

所以基本上在 maven assembly 插件中创建了 2 个执行,并让第一次执行创建所需的 zip 文件,第二次执行可以将其打包成 tar.

但是我收到错误消息说 zip 文件 'is not a file'。

我这样做有什么问题吗?
有没有更有效的方法来做到这一点?

这是我试过的:
我的 POM:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.3</version>
                <executions>
                    <execution>
                        <id>create-zip</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <descriptors>
                                <descriptor>zip.xml</descriptor>
                            </descriptors>
                        </configuration>
                    </execution>
                    <execution>
                        <id>create-tar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                        <descriptors>
                            <descriptor>tar.xml</descriptor>d
                        </descriptors>
                </configuration>
                </execution>
            </executions> 
        </plugin>
    </plugins>
</build>

zip.xml

<assembly xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
      xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>zip-id</id>
<formats>
    <format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
    <fileSet>
      <directory>${project.basedir}/src/main/resources/vertica_schema/schema_migrations</directory>
     <outputDirectory>/</outputDirectory>
    </fileSet>
</fileSets>

tar.xml

<assembly xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://maven.apache.org/plugins/maven-assembly-  plugin/assembly/1.1.2"
      xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>tar-id</id>
<formats>
    <format>tar.gz</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<files> 
    <file>
        <source>/*.zip</source>
        <outputDirectory>/lib</outputDirectory>
        <destName>schema_migrations.zip</destName>
    </file>
</files> 

<source>标签不支持*:只能select单个文件。另外,第一次执行构建的zip文件会在target folder by default里面生成,所以你应该指向那个目录。

默认情况下,zip 文件将被命名为 ${project.build.finalName}-zip-id.zip。您可以通过将 finalName attribute in the plugin configuration. Note that, by default, the assembly id will be concatenated to the finalName. You can turn this off by switching the appendAssemblyId 标志设置为 false.

来更改此名称

这是一个工作配置:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.3</version>
                <executions>
                    <execution>
                        <id>create-zip</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <descriptors>
                                <descriptor>zip.xml</descriptor>
                            </descriptors>
                            <finalName>myzip</finalName> <!-- Name of zip file -->
                            <appendAssemblyId>false</appendAssemblyId> <!-- Do not concatenate "zip-id" to the finalName" -->
                        </configuration>
                    </execution>
                    <execution>
                        <id>create-tar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                        <descriptors>
                            <descriptor>tar.xml</descriptor>d
                        </descriptors>
                </configuration>
                </execution>
            </executions> 
        </plugin>
    </plugins>
</build>

与以下 tar.xml:

<assembly xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://maven.apache.org/plugins/maven-assembly-  plugin/assembly/1.1.2"
      xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>tar-id</id>
<formats>
    <format>tar.gz</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<files> 
    <file>
        <source>${project.basedir}/target/myzip.zip</source>
        <outputDirectory>/lib</outputDirectory>
        <destName>schema_migrations.zip</destName>
    </file>
</files>

最好将 Maven 生成的所有内容都保存在 target 目录下。这是 Maven 的工作文件夹,您不必担心将中间文件放在那里。