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

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

我想构建一个Maven项目,其依赖项位于
.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的目录布局中。为此,您可以使用自定义的
    outputFileNameMapping
    来映射。这使得能够使用;在本例中,我们对组id、工件id和版本感兴趣。我们需要禁用
    ,否则它还将包括项目主工件
  • 对于主工件,我们只需使用一个元素,指向项目的主工件
程序集描述符如下所示:

<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的目录布局中。为此,您可以使用自定义的
    outputFileNameMapping
    来映射。这使得能够使用;在本例中,我们对组id、工件id和版本感兴趣。我们需要禁用
    ,否则它还将包括项目主工件
  • 对于主工件,我们只需使用一个元素,指向项目的主工件
程序集描述符如下所示:

<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任务将其复制到某个地方(例如)。