1

我使用 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>

这样,它无法找到描述符文件。

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

4

2 回答 2

2

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

在我看来,你想要做的最好的方法是使用两个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,我只在其中包含 jar,您可以做任何您想做的事情:

<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,我将项目 tar 和我的文件夹中的脚本包括在内src/main/scripts

<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尝试构建最终程序集时,它将检测到有一个文件已经拥有这个名字并且会失败说它不能包含它自己......

使用我的两次执行解决方案,您可以appendAssemblyIdfalse.

于 2015-04-22T11:37:19.230 回答
0

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

希望这会给你一些开始的东西。

于 2014-01-09T23:00:44.140 回答