如何使用分类器释放多模块项目?

时间:2012-08-02 14:15:06

标签: maven release maven-release-plugin

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

鉴于此用例:

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

所以我们的目标是在最后的存储库中有以下内容(在两次发布之后:prepare,release:perform):

  
      
  • EAR -1- AA.ear
  •   
  • EAR -1- BB.ear
  •   
  • WAR -1- AA.war
  •   
  • WAR -1- BB.war
  •   
  • 接口-1.jar
  •   
  • 延伸-1- AA.jar
  •   
  • 延伸-1- BB.jar
  •   
  • 效用1.jar
  •   

关于如何进行发布构建有很多解释,并且还有如何使用分类器的示例 - 但分类器似乎永远不会在多模块设置中使用。

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

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

1 个答案:

答案 0 :(得分:2)

这对Maven来说非常棘手。 你可以尝试在maven生命周期的包阶段中多次执行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>