在Maven中使用不同的artifactid构建相同的项目(基于使用的JDK)
我有一个场景,其中我的项目需要在不同的JDK中编译,并且根据所使用的JDK,生成的工件名称应该是不同的。 例如,如果项目名称是MyProject并且我调用mvn install,那么它需要在JDK 1.4以及JDK 1.5中编译,最后我得到两个相同项目的jar(MyProjectJDK14-1.0和MyProjectJDK15-1.0)。 有可能实现这个目标吗?
Maven的方法不是更改工件的finalName
而是使用分类器 。 例如:
... maven-jar-plugin ${envClassifier} ... jdk16 1.6 jdk16 jdk15 1.5 jdk15
JAR工件将命名为${finalName}-${envClassifier}.jar
并使用以下语法作为依赖项包含在内:
com.mycompany my-project 1.0 jdk16
你必须两次调用Maven构建来生成两个jar子(一个体面的CI引擎可以做到这一点)。
您可以做的是定义两个配置文件 ,每个JDK使用一个配置文件 。 将激活关于使用哪个JDK的每个配置文件:
profile-for-jdk1.4 false 1.4 myBuild-jdk1.4 profile-for-jdk1.5 false 1.5 myBuild-jdk1.5
然后,在每个配置文件中,定义一个特定的
,它将用于命名生成的JAR文件。
因此,如果使用JDK 1.4构建应用程序,则生成的JAR将命名为myBuild-jdk1.4.jar
。
如果您的最终包是使用程序集构建的,则只需更改配置文件内的
块以配置程序集插件(例如,
)。
关于你的评论:事实上,这个过程需要在Maven上有两个独立的构建,因为你必须在更改JDK版本时重新编译整个项目。 Maven2约定之一是一个项目=一个工件。 你想要的是有一个带有两个工件的项目。
最终,一种解决方案是使用Hudson构建您的应用程序,尤其是此工具的矩阵function ,它允许您使用各种参数运行多个构建,在您的情况下是JDK。
使用Maven配置文件。 在pom.xml
的project
标记内添加此部分:
1.4 ${project.artifactId}-${project.version}-JDK1.4 1.5 ${project.artifactId}-${project.version}-JDK1.5
有关配置文件的更多信息,请参阅此
类似的问题是在不同版本的JDK中使用的JDBC api的不同变体。
我决定这些需要不同的arifactIds而不是分类器。
您可以通过在设置中设置属性然后在artifactId标记中引用它来实现此目的:
4.0.0 throwing-jdbc-${jdbc.version} Throwing JDBC jdbc3 false [1.3,1.4,1.5] 3.0 org.codehaus.mojo build-helper-maven-plugin 1.7 src/jdbc3-variants/java add-source jdbc4 false 1.6 4.0 org.apache.maven.plugins maven-compiler-plugin 1.6 1.6 org.codehaus.mojo build-helper-maven-plugin src/jdbc4/java src/jdbc4-variants/java add-source jdbc41 false 1.7 4.1 org.apache.maven.plugins maven-compiler-plugin 1.7 1.7 org.codehaus.mojo build-helper-maven-plugin src/jdbc4/java src/jdbc4.1/java src/jdbc4.1-variants/java add-source junit junit 3.8.1 test src/main/java org.apache.maven.plugins maven-source-plugin 2.2.1 verify jar
实际上有一种方法可以使用一个构建生成多个WAR(我猜这也适用于JAR):您可以使用具有多个执行的程序集插件来处理不同的描述符。