从其他Maven模块添加jar-with-dependencies工件

时间:2012-09-25 15:08:30

标签: maven maven-2

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

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

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

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>

我还在moduleA的{​​{1}}文件(编译范围)中列出了moduleB作为moduleB的依赖关系。我这样做是因为我相信它会强制pom.xmlmoduleB之后建立;它似乎有用。

有人可以建议为什么我的moduleA程序集没有从moduleB收集jar-with-dependencies输出并且抱怨模式永远不会被触发?

我已尝试指定moduleA的groupId(而不是使用通配符),但它没有帮助。我还试图简化moduleA的汇编描述符,如下所示,结果没有任何变化:

moduleB

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

Maven版本:<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>

3 个答案:

答案 0 :(得分:1)

我认为问题在于您有一个多模块项目,并且您试图让<moduleSet/>引用一个兄弟。从Including Module Binaries您可以找到以下文字:

  

moduleSet部分中的new(自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>

NB 我删除了标记<attachmentClassifier>jar-with-dependencies</attachmentClassifier>,因为它完全错误。

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


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

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

我从未在include选项中使用过通配符,你能提一下包而不是通配符吗?

答案 2 :(得分:0)

在我的情况下,我错过了将该模块作为POM中的依赖项包含在内,并且仅包含在src.xml中。如果您遇到问题,它只是另一个地方。