11

我有一个多模块项目,其中包含 2 个模块(每个模块都有自己的 pom.xml)和一个指向这些模块的父 pom.xml。

当我在父 pom 上运行“mvn clean package”时,每个项目在它自己的目标文件夹下都有一个 zip 文件。我想在 zip 文件的根文件夹下打包一个包含每个模块 zip 文件的 zip 文件,但是这样做时遇到了一些问题。

我在父 pom.xml 文件夹中创建了一个程序集文件:

<!-- Release distribution -->
<assembly>
<id>release</id>
<formats>
    <format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>

<fileSets>
    <fileSet>
        <directory>${basedir}/projectA/target/</directory>
        <outputDirectory>/</outputDirectory>
        <includes>
            <include>*.tar.gz</include>
        </includes>
    </fileSet>
    <fileSet>
        <directory>${basedir}/projectB/target/</directory>
        <outputDirectory>/</outputDirectory>
        <includes>
            <include>*.tar.gz</include>
        </includes>
    </fileSet>
</fileSets>
</assembly>

虽然上述方法可行,但如果我们开始向该项目添加越来越多的模块,则必须不断更新此程序集会变得非常烦人。

理想情况下,我希望它自动进入模块的每个目标文件夹并在其中获取一个 zip 文件。

这可以通过做

...
<fileSet>
        <directory>${basedir}</directory>
        <outputDirectory>/</outputDirectory>
        <includes>
            <include>**/target/*.tar.gz</include>
        </includes>
    </fileSet>

但是这里的问题是 zip 文件将包含完整路径,因此与其在根文件夹中包含 zip 文件,不如在 zip 文件中包含 projectA/target/xxxx.zip 和 projectB/target/xxxx.zip 这正是我所做的不想。

有什么方法可以在 maven 中进行简单的组装,这样我就不必每次添加新模块并且在 zip 中没有完整路径时都更新它?

编辑 1

看起来这根本不可能。要么你得到一个结构良好的 zip 文件,但很难维护程序集,或者你得到一个易于维护但结构令人讨厌的 zip 文件。在找到合适的解决方案之前,我不会回答这个问题

编辑 2

回过头来再次寻找解决方案。关于下面发布的 khmarbaise 解决方案,它存在一些问题: - 它依赖于依赖项的程序集,在我的情况下,我只想要一个程序集的程序集(更像是 fileSets 而不是依赖项集) - 它依赖于我手动的事实指定我想要包含在程序集中的项目。我已经在父 pom 中有这个信息,它指定应该构建哪些模块,所以如果我从父 pom 中删除一个模块以使其不再构建,程序集应该已经知道这一点并跳过选择该项目(原因文件集似乎工作得很好,除了程序集 zip 中的糟糕、不可控制的路径)。

真的没有人遇到过类似的问题吗?

4

2 回答 2

5

首先,我建议创建包含结果包的 dist-packaging 模块。此外,听起来您用于创建包含其他人的 zip 文件的最终存档的程序集描述符是错误的。

  <id>proj1-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>

但是您必须知道,您必须像通常的模块依赖项一样维护 dist-module 中的依赖项,如下所示:

  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>package-one</artifactId>
      <version>${project.version}</version>
      <classifier>package-1-assembly</classifier>
      <type>zip</type>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>package-two</artifactId>
      <version>${project.version}</version>
      <classifier>package-2-assembly</classifier>
      <type>zip</type>
    </dependency>
    ....

在这里您可以找到一个完整的工作示例

于 2013-09-15T17:11:05.267 回答
2

我刚刚遇到了同样的问题:我生成的 zip 文件包含完整的系统路径!我原来的配置是这样的:

<fileSets>
        <fileSet>
            <directory>${project.basedir}/src/main/resources</directory>
            <outputDirectory>${project.build.directory}</outputDirectory>
            <includes>
                <include>someFolder/somefile.txt</include>
            </includes>
        </fileSet>
</fileSets>

结果我的 zip 文件包含完整的系统路径!经过大量调查,我找到了一个可行的解决方案:

<fileSets>
        <fileSet>
            <outputDirectory>./</outputDirectory>
            <directory>src/main/resources</directory>
            <includes>
                <include>someFolder/somefile.txt</include>
            </includes>
        </fileSet>
</fileSets>

因此,当出于某种奇怪的原因指定outputDirectorywith ${project.build.directory}then 时,完整路径将成为 jar/zip 文件的一部分。

于 2017-10-17T15:45:23.420 回答