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

标签 java maven maven-assembly-plugin

我有一个项目使用 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> 

最佳答案

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

默认情况下,zip 文件将被命名为 ${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 的工作文件夹,您不必担心将中间文件放在那里。

关于java - 如何使用 Maven 程序集插件在 tar 中创建和包含一个 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32146002/

相关文章:

java - 如何在for循环中设置限制?

java - swing GUI 中被阻止的外部进程

java - Maven Surefire 适当使用Exclude

java - 可执行Jar,如何设置应用程序名称?

java - 使用maven程序集插件时如何排除项目类文件?

java - ColdFusion Javacast 数组从 loadPaths 到类时出错

java - 从 Calabash(Ruby) 迁移到 Appium(Java)

modulee maven 项目更新的 eclipse 空指针异常

java.lang.NoSuchFieldError : INSTANCE in HttpClient when running Oozie 错误

java - 在 Maven 构建的 JAR 中找不到 Jersey 消息正文阅读器