maven汇编,避免zip文件中的完整路径?

时间:2013-09-12 12:10:07

标签: maven maven-3 maven-assembly-plugin

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

当我跑" mvn clean package"在父pom上,每个项目最终都有一个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中进行简单的汇编,所以每次添加新模块时都不需要更新它,而且拉链内没有完整的路径?

编辑1

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

编辑2

再次寻找解决方案。关于下面发布的khmarbaise解决方案,它有一些问题: - 它依赖于依赖的程序集,在我的例子中我只想要一个程序集的程序集(更像是fileSets而不是依赖集) - 它依赖于我手动指定我想要包含在程序集中的项目这一事实。我已经在父pom中有这个信息,它指定了应该构建哪些模块,所以如果我从父pom中删除一个模块以便它不再构建,程序集应该已经知道并跳过选择该项目(原因fileset似乎工作得很好,除了程序集zip中的shitty,不可控制的路径)。我不应该手动弄乱我想要包含的模块,除了简单地从pom中删除添加模块我正在运行程序集。

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

2 个答案:

答案 0 :(得分: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>
    ....

在这里can find a full working example

答案 1 :(得分:0)

我遇到了同样的问题:我生成的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>

因此,在使用outputDirectory指定${project.build.directory}时,由于某些奇怪的原因,完整路径将成为jar / zip文件的一部分。