如何发布带有分类器的多模块项目?

Posted

技术标签:

【中文标题】如何发布带有分类器的多模块项目?【英文标题】:How to release a multimodule project with a classifier? 【发布时间】:2012-08-02 14:15:06 【问题描述】:

如果其中一个子模块有分类器,你如何发布一个 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 utility-1.jar

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

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

或者分类器真的只适用于单模块项目吗?

【问题讨论】:

【参考方案1】:

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

此外,在执行 maven-war-plugin 时,您可以使用 <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>

【讨论】:

以上是关于如何发布带有分类器的多模块项目?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Spring Boot 的多模块 Web 应用程序 Maven 架构

具有共享模块的多平台项目

如何设置 sbt/scala/play 多模块项目,该项目将与 Intellij scala 插件一起正常工作

如何使用带有 SVC 估计器的 OneVsRestClassifier 的 GridSearchCV?

提供两个不同战争的多模块项目

eclipse中的多模块maven项目如何显示树状目录