如何使用maven的聚合和继承将子模块中的jar收集到父级的tarball中

时间:2017-12-03 07:05:56

标签: java maven

我有一个具有以下结构的多模块maven项目:

root module
            module A
            module B
            module C
                     module C-1
                     module C-2

模块C是此项目的新功能。其目标是为子模块C-1和C-2(即)和聚合 jars定义模块C-1的共享依赖关系和C-2在模块的C target目录中构建为单个tar球。

这个目标是通过以下方式实现的:

  • root pom.xml列出模块A,B和C
  • 模块C pom.xml列出模块C-1和C-2并声明共享依赖项;它还宣称包装为“pom”
  • 模块C中使用
  • maven-assembly-plugin查找其子项*.jar目录中的所有target个文件,并将其打包为tgz。

我对这个实现有几个问题。简单的一个是C-1和C-2的自我依赖 - 它们从C继承了对它自己的依赖,因此拒绝编译。我解决了将依赖关系包装到C中的dependencyManagement中所以看起来它正在工作。

我还有装配插件的问题。在文件集值中使用wildchars时,它会在结果tar球中保留目录结构,看起来你无法对它做任何事情。因此,在模块C的bin.xml中进行跟踪

    <fileSet>
        <directory>${project.basedir}</directory>
        <outputDirectory>/</outputDirectory>
        <includes>
            <include>**/*.jar</include>
        </includes>
        <excludes>
            <exclude>**/*-javadoc.jar</exclude>
        </excludes>

    </fileSet>

导致 tarball 具有结构

moduleC-version/moduleC-1/target/moduleC-1-version.jar
moduleC-version/moduleC-2/target/moduleC-2-version.jar

当我需要时

moduleC-version/moduleC-1-version.jar
moduleC-version/moduleC-2-version.jar
哦,这不太重要。主要问题是Reactor Build Order。无论我做什么,都会导致

  1. 模块A
  2. 模块B
  3. 模块C
  4. 模块C-1
  5. 模块C-2
  6. 自从模块C抱怨后,这是一个失败

      

    创建程序集失败:创建程序集归档文件箱时出错:您必须至少设置一个文件。 - &GT; [帮助1]

    我的理解是问题是按照Reactor构建顺序的顺序 - C-1和C-2应该在C之前构建 - 但是我不知道如何管理它让C成为父母并保持它们在模块结构之上。

1 个答案:

答案 0 :(得分:1)

如果您需要像包这样的分发(例如zip),您必须定义一个包含其配置的单独模块。 此外,您需要将要打包的每个模块定义为依赖项,以确保构建顺序由maven正确完成。

您必须使用的maven-assembly-plugin描述符类似于this:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">

  <id>dist-assembly</id>

  <formats>
      <format>zip</format>
  </formats>

  <includeBaseDirectory>false</includeBaseDirectory>

  <dependencySets>
      <dependencySet>
          <outputDirectory>/</outputDirectory>
          <useProjectArtifact>false</useProjectArtifact>
          <unpack>false</unpack>
          <scope>runtime</scope>
      </dependencySet>
  </dependencySets>
</assembly>

项目的结构看起来更像或更像this:

+- pom.xml
+-- mod1
+-- mod2
+-- dist

更新

如果您只需要模块,则可以将其作为汇编描述符:

  <moduleSets>
    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects>
      <binaries>
        <outputDirectory>modules</outputDirectory>
        <unpack>false</unpack>
      </binaries>
    </moduleSet>
</moduleSets>