在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.xmlproject标记内添加此部分:

    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):您可以使用具有多个执行的程序集插件来处理不同的描述符。