1

我有一个多模块 Maven 项目。其中一个模块负责将所有其他模块的输出打包成一个可交付成果。我目前遇到了一个问题,我的程序集无法从其他模块收集输出,失败并显示以下消息:

[WARNING] The following patterns were never triggered in this artifact 
  inclusion filter:
o  '*:a'

我的项目布局的简化版本如下所示,其中moduleA是一个构建标准 jar-with-dependencies 输出的项目,并且moduleB是我负责打包的模块。根级pom.xml列表moduleAmoduleB模块。

parent
|- moduleA (foo:a)
   |- pom.xml
   |-src
     |- ...   
|- moduleB (foo:b)
   |- pom.xml
   |- src
      |- main
         |- assembly
            |- assembly.xml
|- pom.xml

我已经为它创建了一个程序集描述符moduleB,目前看起来像这样:

<assembly>
  <id>dist</id>
  <formats>
    <format>tar.gz</format>
  </formats>

  <moduleSets>
    <moduleSet>
      <includes>
        <include>*:a</include>
      </includes>
      <binaries>
        <attachmentClassifier>jar-with-dependencies</attachmentClassifier>
        <outputDirectory>package</outputDirectory>
        <dependencySets>
          <dependencySet>
            <excludes>
              <exclude>*:*</exclude>
            </excludes>
          </dependencySet>
        </dependencySets>
      </binaries>
    </moduleSet>
  </moduleSets>
</assembly>

我还列出了in的文件(编译范围)moduleA的依赖项。我这样做是因为我相信它会强制在之后建造;它似乎工作。moduleBmoduleBpom.xmlmoduleBmoduleA

任何人都可以建议为什么我的moduleB程序集没有收集来自 jar-with-dependencies 输出moduleA并抱怨该模式从未被触发?

我曾尝试指定moduleA(而不是使用通配符)的 groupId,但它没有帮助。我还尝试将程序集描述符简化moduleB如下,但结果没有任何变化:

<assembly>
  <id>dist</id>
  <formats>
    <format>tar.gz</format>
  </formats>

  <moduleSets>
    <moduleSet>
      <includes>
        <include>foo:a</include>
      </includes>
      <binaries>
        <outputDirectory>package</outputDirectory>
        <dependencySets></dependencySets>
      </binaries>
    </moduleSet>
  </moduleSets>
</assembly>

:可以在此处找到此问题的 SSCCE:http ://dl.dropbox.com/u/108474287/parent.zip

Maven版本:Apache Maven 2.2.1 (r801777; 2009-08-06 20:16:01+0100)

4

3 回答 3

1

我认为问题在于您有一个多模块项目,并且您尝试<moduleSet/>引用兄弟姐妹。从包含模块二进制文件中,您可以找到以下文本:

moduleSet 部分中的新(自 2.2 起)useAllReactorProjects 标志允许您在多模块构建中使用来自子模块的模块二进制文件。这对于解决 Maven 的构建顺序与模块二进制文件的旧方法之间的冲突非常重要,其中程序集是从父 POM 构建的。

所以我将你的程序集文件更新到这个(添加<useAllReactorProjects/>)并让它工作:

<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>dist</id>
    <formats>
        <format>tar.gz</format>
    </formats>

    <moduleSets>
        <moduleSet>
            <useAllReactorProjects>true</useAllReactorProjects>
            <includes>
                <include>*:a</include>
            </includes>
            <binaries>
                <outputDirectory>package</outputDirectory>
                <dependencySets>
                    <dependencySet>
                        <excludes>
                            <exclude>*:*</exclude>
                        </excludes>
                    </dependencySet>
                </dependencySets>
            </binaries>
        </moduleSet>
    </moduleSets>
</assembly>

注意我已经删除了标签<attachmentClassifier>jar-with-dependencies</attachmentClassifier>,因为它是完全错误的。

输出是.tar.gz我认为你想要实现的,尽管这jar-with-dependencies有点指向另一个方向。我不太清楚你想要什么...


的替代方法maven-assembly-plugin是使用maven-shade-plugin.

于 2012-09-26T07:42:47.887 回答
0

就我而言,我错过了将该模块作为 POM 中的依赖项包含在 src.xml 中。如果您遇到问题,它只是另一个可以查看的地方。

于 2014-03-07T06:26:51.917 回答
0

根据 Maven 文档,给定以下项目结构,以及父 POM 中的所有适当模块引用:

+ parent (groupId: org.test, artifactId: parent)
  |
  + child1 (groupId: org.test, artifactId: child1)
  |
  + child2 (groupId: org.test, artifactId: child2)

我们可以使用以下 moduleSet 只选择 child1 模块:

<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">
  [...]
  <moduleSets>
    [...]
    <moduleSet>
      <includes>
        <include>org.test:child1</include>
      </includes>
    </moduleSet>
  </moduleSets>
  [...]
</assembly>

我从来没有在包含选项中使用通配符,你能提到包而不是通配符吗?

于 2012-09-25T15:22:18.317 回答