首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用maven程序集将一个tar打包为另一个tar

使用maven程序集将一个tar打包为另一个tar
EN

Stack Overflow用户
提问于 2013-09-25 14:37:31
回答 2查看 1.7K关注 0票数 1

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

要做到这一点,需要使用pom.xml中指定的两个描述符,一个描述符用于project.tar,第二个描述符用于final.tar。

这样做时,我将面临以下错误。

代码语言:javascript
复制
[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文件是

代码语言:javascript
复制
...
<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文件作为
代码语言:javascript
复制
...
<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>

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

如果我做错了什么,谁能指点我吗?

EN

回答 2

Stack Overflow用户

发布于 2015-04-22 11:37:19

我知道这篇文章很旧,但我想可能需要一些解释。

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

下面是我要做的事情(当然,它也很有效)。

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

代码语言:javascript
复制
<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中配置执行(永远不要忘记执行的顺序非常重要,因为如果它们绑定在同一个阶段,它们将按照声明顺序执行):

代码语言:javascript
复制
<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>

(您可以看到tars将位于不同的文件夹中,并且项目tar将不将程序集id附加到其名称中,因此它将类似于myproject-1.0.tar)

现在关于程序集的定义。

对于-tar.xml项目,我只需将jars包含在其中,您就可以随心所欲:

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
<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>

我们到了,你有你的两个塔塔。

有一个更简单的解决方案,正如您在开始时所做的那样:

代码语言:javascript
复制
<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设置为真,因为如果没有,两个程序集将具有相同的名称,而当maven-assembly-plugin尝试构建最终程序集时,它将检测到有一个文件已经具有此名称,并将失败地说它不能包含自己.

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

票数 2
EN

Stack Overflow用户

发布于 2014-01-09 23:00:44

部分答案是使用汇编语言插件descriptorRef中概述的示例

希望这能给你一些开始的机会。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19007903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档