如何使用 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}
.
里面输出想要的目录结构
我想构建一个具有 .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}
.