代码之家  ›  专栏  ›  技术社区  ›  James Kingsbery

maven程序集:包含具有不同分类器的依赖项

  •  11
  • James Kingsbery  · 技术社区  · 14 年前

    我想在maven中构建两个不同版本的战争(我知道这是一个不可以的,这正是考虑到当前形势的方式)。在由程序集描述的war版本中,我希望用不同的分类器替换相同的依赖项。例如,我希望此程序集工作:

    <assembly>
      <id>end-user</id>
      <formats>
        <format>war</format>
      </formats>
      <dependencySets>
        <dependencySet>
          <excludes>
            <exclude>group:artifact:jar:${project.version}</exclude>
          </excludes>
          <includes>
            <include>group:artifact:jar:${project.version}:end-user</include>
          </includes>
        </dependencySet>
      </dependencySets>
    </assembly>
    

    这不管用,但我的方向对吗?我已经读完了 Maven assembly page 以及 Maven Definitive Guide 这似乎是相关的。任何指针都会有帮助。

    2 回复  |  直到 13 年前
        1
  •  8
  •   Pascal Thivent    14 年前

    我个人认为,最干净的解决方案是使用两个概要文件(其中一个依赖于带有分类器的工件,另一个依赖于“常规”工件)。但是您确实可以通过自定义程序集实现所需的功能。我只是觉得你的方向不对。我会这样做…

    首先,为程序集创建一个特定的项目,并将webapp和带有分类器的工件声明为依赖项。像这样的:

    <project>
      ...
      <dependencies>
        <dependency>
          <groupId>${project.groupId}</groupId>
          <artifactId>artifact</artifactId>
          <version>${project.version}</version>
          <classifier>end-user<classifier>
        </dependency>
        <dependency>
          <groupId>${project.groupId}</groupId>
          <artifactId>zewebapp</artifactId>
          <version>${project.version}</version>
          <type>war</type>
        </dependency>
      </dependencies>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2-beta-5</version>
            <configuration>
              <descriptors>
                <descriptor>src/main/assembly/end-user.xml</descriptor>
              </descriptors>
            </configuration>
            <executions>
              <execution>
                <id>make-assembly</id>
                <!-- this is used for inheritance merges -->
                <phase>package</phase>
                <!-- append to the packaging phase. -->
                <goals>
                  <goal>single</goal>
                  <!-- goals == mojos -->
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </project>
    

    然后,在程序集描述符中:

    <assembly>
      <id>end-user</id>
      <formats>
        <format>war</format>
      </formats>
      <includeBaseDirectory>false</includeBaseDirectory>
      <dependencySets>
        <dependencySet>
          <unpack>true</unpack>
          <unpackOptions>
            <excludes>
              <exclude>**/artifact-*.jar</exclude>
            </excludes>
          </unpackOptions>
          <includes>
            <include>*:war</include>
          </includes>
        </dependencySet>
        <dependencySet>
          <unpack>false</unpack>
          <outputDirectory>WEB-INF/lib</outputDirectory>
          <includes>
            <include>group:artifact:jar:*:end-user</include>
          </includes>
        </dependencySet>    
      </dependencySets>
    </assembly>
    

    基本上,这告诉程序集插件为 zewebapp 并且在解包时排除不需要的工件。然后,程序集插件使用分类器获取工件并将其放入 WEB-INF/lib (所以我们把它替换成原来的)。最后,整件事被包装成一场战争。

    我在一个简单的例子上测试了这个,它应该可以工作。

        2
  •  4
  •   kctang    13 年前

    为includes/include*指定工件坐标时,不需要“版本”信息。

    这应该有效:

    <assembly>
      <id>end-user</id>
      <formats>
        <format>war</format>
      </formats>
      <dependencySets>
        <dependencySet>
          <includes>
            <include>group:artifact:jar:end-user</include>
          </includes>
        </dependencySet>
      </dependencySets>
    </assembly>
    

    我认为 maven assembly documentation 因为includes/include*部分不正确。它说“工件的协调性可以用简单的groupid:artifactid形式给出,也可以用groupid:artifactid:type:version[:classifier]形式完全限定。”但是,从我的测试来看,不需要“version”。我得到了暗示 here .

    花了我一段时间才发现,这种想法可能对将来的其他人有用。