2

如果其中一个子模块有分类器,你如何发布一个 Maven 多模块项目?

鉴于此用例:

  • 多模块项目:EAR、WAR、interface-jar、extension-AA-jar、extension-BB-jar、utility-jar
  • 所有的 JAR 都必须只构建一次(或至少只部署一次到存储库,因为禁止部署具有相同版本的相同工件)
  • 必须为两种不同的设置构建 WAR,一次使用 extension-AA-jar,一次使用 extension-BB-jar
  • 只有单个extension-XX-jar使这两个版本有所不同
  • 我想通过分类器区分存储库中的两个最终工件 (AA|BB)
  • 还应该有两个 EAR,只包含一个 WAR(也由相同的分类器标识)
  • 我不想要两个 WAR/EAR 的额外项目,因为内容将 100% 相同。

所以目标是在最后的存储库中包含以下内容(在两次发布:准备,发布:执行之后):

  • EAR-1-AA.ear
  • EAR-1-BB.ear
  • WAR-1-AA.war
  • WAR-1-BB.war
  • interface-1.jar
  • extension-1-AA.jar
  • extension-1-BB.jar
  • 实用程序 1.jar

关于如何进行发布构建有很多解释,也有如何使用分类器的示例 - 但分类器似乎从未在多模块设置中使用。

注意:第一个版本通常不会成为问题,因为尚未部署新版本的工件。但是为第二个分类器发布会破坏整个事情,因为 maven 会尝试使用相同的版本再次构建和部署 jars,并且存储库将(希望)不允许它。这对于 WAR 和 EAR 来说不是问题,因为考虑到分类器以唯一标识工件

还是分类器真的只适用于单模块项目?

4

1 回答 1

2

这对 Maven 来说非常棘手。您可以在 maven 生命周期的 package 阶段尝试多次执行 maven-[jar/war/ear]-plugins。在每次执行中,您可以设置不同的分类器。

此外,在执行 maven-war-plugin 时,您可以使用 an<overlay>将具有正确分类器的扩展名放入 WAR 文件中。在 maven-ear-plugin 的执行中,您可以将具有正确分类器的 WAR 文件指定为<webModule>.

例子

在扩展模块中,您可以像这样配置 maven-jar-plugin:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <executions>
        <execution>
          <id>extension-AA</id>
          <phase>package</phase>
          <goals>jar</goals>
          <configuration>
            <classifier>AA</classifier>
          </configuration>
        </execution>
        <execution>
          <id>extension-BB</id>
          <phase>package</phase>
          <goals>jar</goals>
          <configuration>
            <classifier>BB</classifier>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
  ...
</build>

WAR 模块的配置非常相似:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <executions>
    <execution>
      <id>extension-AA</id>
      <phase>package</phase>
      <goals>
        <goal>war</goal>
      </goals>
      <configuration>
        <overlays>
          <overlay>
            <groupId>com.example</groupId>
            <artifactId>extension-1</artifactId>
            <classifier>AA</classifier>
          </overlay>
        </overlays>
      </configuration>
    </execution>
    <execution>
      <id>extension-BB</id>
      <phase>package</phase>
      <goals>
        <goal>war</goal>
      </goals>
      <configuration>
        <overlays>
          <overlay>
            <groupId>com.example</groupId>
            <artifactId>extension-1</artifactId>
            <classifier>BB</classifier>
          </overlay>
        </overlays>
      </configuration>
    </execution>
  </executions>
</plugin>

最后是EAR模块的配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-ear-plugin</artifactId>
  <executions>
    <execution>
      <id>extension-AA</id>
      <phase>package</phase>
      <goals>
        <goal>ear</goal>
      </goals>
      <configuration>
        <classifier>AA</classifier>
        <modules>
          <webModule>
            <groupId>com.example</groupId>
            <artifactId>war-1</artifactId>
            <classifier>AA</classifier>
          </webModule>
        </modules>
      </configuration>
    </execution>
    <execution>
      <id>extension-BB</id>
      <phase>package</phase>
      <goals>
        <goal>ear</goal>
      </goals>
      <configuration>
        <classifier>BB</classifier>
        <modules>
          <webModule>
            <groupId>com.example</groupId>
            <artifactId>war-1</artifactId>
            <classifier>BB</classifier>
          </webModule>
        </modules>
      </configuration>
    </execution>
  </executions>
</plugin>
于 2012-08-02T14:44:10.600 回答