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

Posted

技术标签:

【中文标题】如何使用 maven 程序集插件在 tar 中创建和包含 zip 文件【英文标题】:How to create and include a zip file inside a tar using maven assembly plugin 【发布时间】:2015-08-21 17:20:12 【问题描述】:

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

我尝试做这样的事情:maven-assembly plugin - how to create nested assemblies

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

但我收到错误消息说 zip 文件“不是文件”。

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

这是我尝试过的: 我的 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> 

【问题讨论】:

&lt;source&gt; 标签更改为$project.basedir/target/[name of zip file].zip。您不能在&lt;source&gt; 中包含*,并且第一次执行构建的zip 将在target 中生成它。 感谢工作。我可以更改第一次执行时构建的 zip 文件的名称吗?我试过 不起作用。我可以将第一次执行的 指定为 '$project.basedir/src/main/....' 还是只需要在目标内部?还有一种有效的方法来处理/删除在目标中创建的中间 zip 文件吗? 【参考方案1】:

&lt;source&gt; 标签不支持*:它只能选择一个文件。另外,第一次执行生成的zip文件会在target folder by default里面生成,所以你应该指向那个目录。

默认情况下,压缩文件将命名为$project.build.finalName-zip-id.zip。您可以通过在插件配置中设置finalName 属性来更改此名称。请注意,默认情况下,程序集 ID 将连接到 finalName。您可以通过将 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 的工作文件夹,您不必担心在其中保留中间文件。

【讨论】:

我使用了 ,但 zip 文件的名称为 myzip-zip-id.zip。我是否缺少阻止 maven 将描述符 id 附加到文件名末尾的设置? 我需要以同样的方式创建另一个 zip 文件。我是否必须为其创建另一个执行,还是有办法利用现有的 zip 执行? @Gadam 我编辑了我的帖子以包含appendAssemblyId 标志。您应该为每个生成的文件(程序集)创建一个执行。 感谢@Tunaki,提供详细而准确的答案!

以上是关于如何使用 maven 程序集插件在 tar 中创建和包含 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

myeclise中创建maven web程序

maven之在eclipse中创建maven项目

是否可以使用 openapi-generator maven 插件在现有的 maven 项目中创建 Java 客户端?

如何在 Maven 中创建校验和,然后将其输出到文本文件?

如何在 Maven 中创建 Servlet 3.0 Web 应用程序?

eclipse 中创建maven 项目pom.xml配置好了不自动下载jar包是为啥