使用maven生成的jar创建一个带有依赖性和少量其他文件的tar

时间:2015-03-27 07:56:16

标签: maven maven-assembly-plugin

我是maven的新手,也是我学习的有趣主题。 成功创建一个具有依赖关系的jar,使用:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>

    <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <executions>
            <execution>
            <phase>package</phase>
            <goals>
            <goal>single</goal>
            </goals>
            </execution>
        </executions>
        </configuration>
    </plugin>

现在,我必须在tar中包含一些shell脚本并生成jar。 为此,我尝试了以下方法: 添加了

 <descriptors>
    <descriptor>hadoop-job.xml</descriptor>
 </descriptors>

到上面的脚本。

在hadoop-job.xml中,我将所需的文件包含在tar中。

问题是首先生成tar并且在目标中找不到* .jar。 有没有办法先安排jar创建,然后安排tar,因为这两个配置都位于程序集插件中。 要么 是否有命令首先执行并生成jar,然后生成tar命令?

顺便说一句,我正在执行mvn clean assembly:assembly -Dbinary = true。 帮我解决感谢。

1 个答案:

答案 0 :(得分:4)

这是一个构建jar-with-dependencies的组件的示例,之后是一个包含这个jar-with-dependencies的tar(由maven-assembly-plugin构建)。在tar中,我还在文件夹.sh中的src/main/bin中包含了shell脚本文件。

首先,插件配置:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.5.3</version>
    <executions>
        <execution>
            <id>jar-with-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <descriptorRefs>
                    <descriptorId>jar-with-dependencies</descriptorId>
                </descriptorRefs>
            </configuration>
        </execution>
        <execution>
            <id>all</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <descriptors>
                    <descriptor>src/assembly/all.xml</descriptor>
                </descriptors>
            </configuration>
        </execution>
    </executions>
    <configuration>
        <outputDirectory>${project.build.directory}/assembly/</outputDirectory>
    </configuration>
</plugin>

执行顺序很重要因为如果我想将jar-with-dependencies包含到我的tar中,我需要先构建它。
我将所有程序集放在同一个文件夹中,这就是为什么我在configuration

configuration标记之外还有一个全局executions标记的原因

然后我的程序集文件all.xml的内容:

<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>all</id>
    <formats>
        <format>tar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory> 
    <fileSets>
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>**/*.jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>src/main/bin</directory>
            <outputDirectory>bin</outputDirectory>
            <fileMode>755</fileMode>
        </fileSet>
    </fileSets>
</assembly>

includeBaseDirectory是为了避免我的tar包含带有版本的项目名称的根文件夹。
如果未指定outputDirectory标记,则归档文件夹中的文件夹结构将从项目的根目录开始,例如,它将包含带有路径target/your-project-1.0-SNAPSHOT.jar的jar。 / p>

编辑:我之前完成的插件配置可以通过以下方式进行简化:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.5.3</version>
    <executions>
        <execution>
            <id>jar-with-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <descriptorId>jar-with-dependencies</descriptorId>
                <descriptors>
                    <descriptor>src/assembly/all.xml</descriptor>
                </descriptors>
            </configuration>
        </execution>
    </executions>
    <configuration>
        <outputDirectory>${project.build.directory}/assembly/</outputDirectory>
    </configuration>
</plugin>

原因是因为maven-assembly-plugin descriptorIddescriptors之前阅读,所以这对我们的情况有好处,但如果没有,我们需要两次执行,因为关注更高命令。 必须同样注意descriptors的顺序,它们是按照阅读顺序执行的(它看起来似乎是逻辑但我认为它可能有用)。