Java 如何使用Maven创建一个jar,在每个依赖项的单独文件夹中包含依赖项
我想构建一个Maven项目,其依赖项位于Java 如何使用Maven创建一个jar,在每个依赖项的单独文件夹中包含依赖项,java,maven,maven-dependency-plugin,Java,Maven,Maven Dependency Plugin,我想构建一个Maven项目,其依赖项位于.jar之外,但每个依赖项必须位于单独的目录中,如下所示: libs/${dependency.groupId}/${dependency.artifactId}/${dependency.version} 就这样, /build my.jar /libs /org.yaml /snakeyaml /1.17 snakeyaml-1.17.jar /etc... 我知道有一个mav
.jar
之外,但每个依赖项必须位于单独的目录中,如下所示:
libs/${dependency.groupId}/${dependency.artifactId}/${dependency.version}
就这样,
/build
my.jar
/libs
/org.yaml
/snakeyaml
/1.17
snakeyaml-1.17.jar
/etc...
我知道有一个
maven依赖插件
,但是如何配置它呢?或者有其他插件可以做到这一点?您真正想做的是为您的项目创建自定义归档。为此,您需要使用
有多个方面需要考虑:
- 您需要一个
的基本目录。这是由参数设置的build
- 您希望将项目的所有依赖项都放在类似repo的目录布局中。为此,您可以使用自定义的
来映射。这使得能够使用;在本例中,我们对组id、工件id和版本感兴趣。我们需要禁用outputFileNameMapping
,否则它还将包括项目主工件 - 对于主工件,我们只需使用一个元素,指向项目的主工件
<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>
有了这样的配置,启动
mvn clean install
将在target/${finalName}
中输出所需的目录结构,您真正想做的是为您的项目创建一个自定义存档。为此,您需要使用
有多个方面需要考虑:
- 您需要一个
的基本目录。这是由参数设置的build
- 您希望将项目的所有依赖项都放在类似repo的目录布局中。为此,您可以使用自定义的
来映射。这使得能够使用;在本例中,我们对组id、工件id和版本感兴趣。我们需要禁用outputFileNameMapping
,否则它还将包括项目主工件 - 对于主工件,我们只需使用一个元素,指向项目的主工件
<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>
使用这种配置,启动
mvn clean install
将在target/${finalName}
中输出所需的目录结构my.jar
将不是可执行的jar,因为它本身不包含依赖类。听起来你想创建一个程序集,就像一个自定义的ZIP?@Tunaki。它不需要包含依赖类,在真实的项目中也会有launcher,它将获取所有库并使用有效的类路径运行该.jar。我会编辑标题。好的,但我想你需要将它们打包到一个最终容器中,比如ZIP或TAR?@Tunaki no,带有所有依赖项的普通目录树。那么你如何构建最终发布的存档?my.jar
将不是一个可执行的jar,因为它本身不包含依赖项类。听起来你想创建一个程序集,就像一个自定义的ZIP?@Tunaki。它不需要包含依赖类,在真实的项目中也会有launcher,它将获取所有库并使用有效的类路径运行该.jar。我会编辑标题。好的,但我想你需要将它们打包到一个最终容器中,比如ZIP或TAR?@Tunaki no,普通目录树和所有依赖项。那么你如何构建最终发布的存档?我不知道如何在具有父POM的多模块项目中使用它,我不断获取创建程序集失败:将文件添加到存档时出错:B:\path\artifact-1.0.pom
,将其添加到异常列表似乎不会改变任何东西。好的,我想我已经得到了这个,但我需要创建其他项目,该项目将在最后执行,并在其中使用此插件。所以谢谢;)如果你还在这里,还有一个问题是,有没有办法将baseDirectory
移动到artifact/target
目录之外?@GotoFinal这是另一个问题。Maven生成的所有内容都应该放在target
中,您真的不想这样做。一般来说,当你有一个最终的工件时,“移动”它到target
之外意味着,用Maven术语来说,在Maven deploy插件的帮助下部署它:它将把你的工件推到配置好的远程存储库中。在这个目录结构的特殊情况下,您可能会使用maven antrun插件
,并让Ant任务将其复制到某个地方(如)。我不知道如何在具有父pom的多模块项目中使用它,我一直得到创建程序集失败:将文件添加到存档时出错:B:\path\artifact-1.0.pom
,将它添加到异常列表似乎不会改变任何事情。好吧,我想我已经得到了这个,但我需要创建额外的项目,该项目将在最后执行,并在其中使用这个插件。所以谢谢;)如果你还在这里,还有一个问题是,有没有办法将baseDirectory
移动到artifact/target
目录之外?@GotoFinal这是另一个问题。Maven生成的所有内容都应该放在target
中,您真的不想这样做。一般来说,当你有一个最终的工件时,“移动”它到target
之外意味着,用Maven术语来说,在Maven deploy插件的帮助下部署它:它将把你的工件推到配置好的远程存储库中。在目录结构的这种特殊情况下,您可能会使用maven-antrun插件
,并使用Ant任务将其复制到某个地方(例如)。