如何使用Maven创建一个jar,其中包含每个依赖项的单独文件夹中的依赖项

时间:2016-07-02 12:42:25

标签: java maven maven-dependency-plugin

我想构建一个具有.jar之外的依赖项的Maven项目,但每个依赖项必须位于一个单独的目录中:

libs/${dependency.groupId}/${dependency.artifactId}/${dependency.version}

就像这样:

/build
  my.jar
  /libs
    /org.yaml
      /snakeyaml
        /1.17
          snakeyaml-1.17.jar
    /etc...

我知道有一个maven-dependency-plugin,但是如何配置呢?或者还有其他插件可以做到这一点吗?

1 个答案:

答案 0 :(得分:3)

您真正想要做的是为您的项目创建自定义存档。为此,您希望使用maven-assembly-plugin

需要考虑多个方面:

  • 您想要一个build的基目录。这由<baseDirectory>参数设置。
  • 您希望将所有项目的依赖项放在类似repo的目录中。为此,您可以为dependencySet使用自定义outputFileNameMapping。这样可以使用a set of properties;在这种情况下,我们对组ID,工件ID和版本感兴趣。我们需要禁用<useProjectArtifact>,否则它还会包含项目主要工件。
  • 对于主要工件,我们只使用<file>元素,指向项目的主要工件。

汇编描述符如下所示:

<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>bin</id>
    <formats>
        <format>dir</format> <!-- to turn into final archive type -->
    </formats>
    <baseDirectory>build</baseDirectory>
    <files>
        <file>
            <source>${project.build.directory}/${project.build.finalName}.${project.packaging}</source>
        </file>
    </files>
    <dependencySets>
        <dependencySet>
            <outputDirectory>libs</outputDirectory>
            <outputFileNameMapping>${artifact.groupId}/${artifact.artifactId}/${artifact.version}/${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
            <useProjectArtifact>false</useProjectArtifact>
        </dependencySet>
    </dependencySets>
</assembly>

请注意,它使用<format> dir,这意味着它不会&#34;打包&#34;存档中的输出结构,但将其保留为目录结构。将来,您可以使用启动器脚本自定义此程序集描述符,并通过将此格式更改为您想要的格式来对其进行最终存档。

最后,插件本身的配置将是

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <descriptor>src/main/assembly/assembly.xml</descriptor> <!-- path to the above assembly descriptor -->
                </descriptors>
            </configuration>
        </execution>
    </executions>
</plugin>

使用这样的配置,启动mvn clean install将在target/${finalName}内输出所需的目录结构。