maven装配包装理解

时间:2016-06-30 04:42:32

标签: java maven maven-assembly-plugin

需要帮助理解打击maven程序集文件。我们有很多maven项目,这会将所有依赖项复制到xc / plugins文件夹中。但我添加了一个依赖,它没有得到打包。后来我发现我必须在依赖项下添加它而不是在dependencySet下。即使我需要在父pom下添加它,然后它才会被添加。如果将它添加到子pom文件下,则不会打包。在此基础上需要帮助。

如何选择所有依赖关系jar。

<moduleSets>
    <moduleSet>
      <binaries>
        <outputDirectory>xc/plugins</outputDirectory>
        <outputFileNameMapping>
          ${module.groupId}.${module.artifactId}-${module.version}${dashClassifier?}.${module.extension}
        </outputFileNameMapping>
        <unpack>false</unpack>
        <includeDependencies>false</includeDependencies>
      </binaries>
      <excludes>
        <exclude>org.opendaylight.controller:sal.networkconfiguration</exclude>
        <exclude>org.opendaylight.controller:sal.networkconfiguration.implementation</exclude>
      </excludes>
    </moduleSet>
  </moduleSets>
  <dependencySets>
    <dependencySet>
      <outputDirectory>xc/plugins</outputDirectory>
      <excludes>
        <exclude>org.slf4j:slf4j-api</exclude>
        <exclude>ch.qos.logback:logback-core</exclude>
        <exclude>ch.qos.logback:logback-classic</exclude>
        <exclude>com.sun.jersey:jersey-core</exclude>
        <exclude>com.sun.jersey:jersey-json</exclude>
      </excludes>
      <outputFileNameMapping>
        ${artifact.groupId}.${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
      </outputFileNameMapping>
      <unpack>false</unpack>
      <scope>runtime</scope>
      <useTransitiveDependencies>false</useTransitiveDependencies>
      <useProjectArtifact>false</useProjectArtifact>
    </dependencySet>
  </dependencySets>

1 个答案:

答案 0 :(得分:1)

汇编插件通常是Maven高级用户学习掌握的最后一件事。它有它的怪癖,但(一如既往)一旦你理解了它的实际作用,更重要的是它是如何工作的,你会发现它更容易使用。

让我们假设你有一个像这样的多模块构建:

pom.xml (root pom that lists the modules mod1, mod2, mod3 and assembly)
|
+-- mod1
|   |
|   +-- pom.xml
|
+-- mod2
|   |
|   +-- pom.xml
|
+-- mod3
|   |
|   +-- pom.xml
|
+-- assembly
    |
    +-- pom.xml
    +-- assembly-file.xml (the assembly descriptor)

<moduleSets>中列出的任何内容均适用于mod1mod2mod3 assembly。 您已在<includeDependencies>false</includeDependencies>下指定了<binaries>,因此此配置不会包含任何依赖项, 仅由mod1mod2mod3 assembly生成的工件。

大多数情况下,我倾向于为<packaging>pom</packaging>模块指定assembly。这样做的原因是程序集通常不包含任何代码,它只是一个程序集,所以我不想从中包含任何内容。

在另一个角落,<dependencySets>(不是<binaries>下的那个)仅适用于assembly POM 的依赖关系,没有别的。因此,除非您指定mod1mod2mod3作为程序集POM的依赖项(这完全没问题,如果它是您想要的),这个<dependencySets>不会做太多事;否则,它按预期工作。

如果要配置整个多模块构建的依赖关系集,<binaries>部分包含自己的<dependencySets>。但在您的特定情况下,您已声明<includeDependencies>false</includeDependencies>,因此声明<dependencySets>下的<binaries>会变得矛盾。

最后,<fileSets><files>适用于assembly POM,因此,除非该项目中有任何文件(例如src/main/resources下),否则您将获胜。使用它。如果您需要对来自mod1mod2mod3的文件进行特定的包含,请使用<unpackOptions><binaries>下的<dependencySets>在你想做什么。