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

How to create a jar with Maven that includes dependencies in a separate folder for each dependency

我想构建一个具有 .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,但是怎么配置呢?还是有其他插件可以做到这一点?

您在这里真正想做的是为您的项目创建自定义存档。为此,您想使用 maven-assembly-plugin.

有多个方面需要考虑:

  • 您想要 build 的基本目录。这是由 <baseDirectory> 参数设置的。
  • 您想将项目的所有依赖项都放在类似 repo 的目录布局中。为此,您可以为 dependencySet. This enables to use a set of properties 使用自定义 outputFileNameMapping;在这种情况下,我们对组 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>

请注意,它使用 dir<format>,这意味着它不会 "package" 存档内的输出结构,而是将其保留为目录结构。将来,您将能够使用您的启动器脚本自定义此程序集描述符,并通过将此格式更改为您想要的格式来制作最终存档。

最后就是插件本身的配置

<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}.

里面输出想要的目录结构