【问题标题】:Packing one tar created using maven assembly into another tar using maven assembly将使用 maven 程序集创建的一个 tar 打包到使用 maven 程序集创建的另一个 tar
【发布时间】:2013-09-25 14:37:31
【问题描述】:

我使用 maven 程序集描述符创建了一个 tar(比如 project.tar)。 我需要再创建一个 tar(比如 final.tar)文件,其中包含先前创建的 tar(project.tar)和一个脚本文件。

为此,我尝试使用 pom.xml 中指定的两个描述符。一个描述符用于 project.tar,第二个用于 final.tar。

这样做时,我遇到了以下错误。

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:2.4:single (default-cli) on project ede: Failed to create assembly: Error creating assembly archive bin: A tar file cannot include itself. -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:2.4:single (default-cli) on project ede: Failed to create assembly: Error creating assembly archive bin: A tar file cannot include itself. " 

我的 pom.xml 文件是

...
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <goals>
        <goal>single</goal>
    </goals>
    <configuration>
    <descriptors>
        <descriptor>assembly/src.xml</descriptor>
        <descriptor>assembly/final.xml</descriptor>
    </descriptors>
    <appendAssemblyId>false</appendAssemblyId>
    </configuration>
</plugin>
...

  1. 我也尝试过使用 pom.xml 文件作为
...
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <id>jar-with-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <descriptors>
                    <descriptor>assembly/src.xml</descriptor>
                </descriptors>
                <appendAssemblyId>false</appendAssemblyId>
            </configuration>
        </execution>
        <execution>
            <id>bin</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <descriptors>
                    <descriptor>assembly/final.xml</descriptor>
                </descriptors>
                <appendAssemblyId>false</appendAssemblyId>
                <finalName>ede2</finalName>
            </configuration>
        </execution>
    </executions>
</plugin>

这样就无法定位描述符文件了。

如果我做错了什么,有人可以指导我吗?

【问题讨论】:

    标签: maven maven-assembly-plugin


    【解决方案1】:

    我知道这篇文章很老了,但我认为它可能需要一些解释。

    在我看来,最好的方法是使用两个executions 中的maven-assembly-plugin。第一个将生成您的项目 tar,第二个将生成最终的 tar。 (在说有更简单之前请阅读所有答案)

    这就是我会做的事情(它当然有效)。

    因为我喜欢将程序集放在不同的文件夹中(因为我认为这样更容易),所以我在 pom 中使用目录路径声明属性:

    <properties>
        <myproperties.assembly.project-tar.dir>${project.build.directory}/assembly-project/</myproperties.assembly.project-tar.dir>
        <myproperties.assembly.final-tar.dir>${project.build.directory}/assembly-final/</myproperties.assembly.final-tar.dir>
    </properties>
    

    然后在maven-assembly-plugin中配置执行(永远不要忘记执行的顺序非常重要,因为如果它们绑定在同一阶段,它们将按照声明顺序执行):

    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.5.3</version>
        <executions>
            <execution>
                <id>project-tar</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <outputDirectory>${myproperties.assembly.project-tar.dir}</outputDirectory>
                    <descriptors>
                        <descriptor>src/assembly/project-tar.xml</descriptor>
                    </descriptors>
                </configuration>
            </execution>
            <execution>
                <id>final-tar</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
                <configuration>
                    <outputDirectory>${myproperties.assembly.final-tar.dir}</outputDirectory>
                    <descriptors>
                        <descriptor>src/assembly/final-tar.xml</descriptor>
                    </descriptors>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    (您可以看到 tar 将位于不同的文件夹中,并且项目 tar 不会在其名称后附加程序集 ID,因此它看起来像 myproject-1.0.tar)

    现在关于程序集定义。

    对于 project-tar.xml,我只是将 jars 包含在其中,您可以为所欲为:

    <assembly
        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        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>project</id>
        <formats>
            <format>tar</format>
        </formats>
        <includeBaseDirectory>false</includeBaseDirectory> 
        <fileSets>
            <fileSet>
                <directory>${project.build.directory}</directory>
                <outputDirectory></outputDirectory>
                <includes>
                    <include>*.jar</include>
                </includes>
            </fileSet>
        </fileSets>
    </assembly>
    

    对于 final-tar.xml,我在我的文件夹 src/main/scripts 中包含项目 tar 和脚本:

    <assembly
        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        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>final</id>
        <formats>
            <format>tar</format>
        </formats>
        <includeBaseDirectory>false</includeBaseDirectory> 
        <fileSets>
            <fileSet>
                <directory>${myproperties.assembly.project-tar.dir}</directory>
                <outputDirectory></outputDirectory>
                <includes>
                    <include>*.tar</include>
                </includes>
            </fileSet>
            <fileSet>
                <directory>src/main/scripts</directory>
                <outputDirectory></outputDirectory>
                <fileMode>755</fileMode>
            </fileSet>
        </fileSets>
    </assembly>
    

    我们到了,你有两个焦油。


    有一个更简单的解决方案,就像你在开始时所做的那样:

    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.5.3</version>
        <executions>
            <execution>
                <id>project-tar</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
                <configuration>
                    <descriptors>
                        <descriptor>src/assembly/project-tar.xml</descriptor>
                        <descriptor>src/assembly/final-tar.xml</descriptor>
                    </descriptors>
                </configuration>
            </execution>
        </executions>
        <configuration>
            <appendAssemblyId>true</appendAssemblyId>
        </configuration>
    </plugin>
    

    descriptors 的顺序当然非常重要。

    与您的初始解决方案的唯一区别是我将属性 appendAssemblyId 设置为 true,因为如果不是,这两个程序集将具有相同的名称,并且当 maven-assembly-plugin 将尝试构建最终程序集时,它将检测到有一个文件已经有这个名字,并且会失败,说它不能包含自己......

    使用我的解决方案进行两次执行,您可以将appendAssemblyId 设置为false

    【讨论】:

      【解决方案2】:

      部分答案是使用在程序集插件examples 中概述的descriptorRef。

      希望这会给你一些入门的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多