如何发布带有分类器的多模块项目?
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 插件一起正常工作