我想构建一个具有.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
,但是如何配置呢?或者还有其他插件可以做到这一点吗?
答案 0 :(得分:3)
您真正想要做的是为您的项目创建自定义存档。为此,您希望使用maven-assembly-plugin
。
需要考虑多个方面:
build
的基目录。这由<baseDirectory>
参数设置。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}
内输出所需的目录结构。