使用不同的artifactid在Maven中构建相同的项目(基于使用的JDK)

Man*_*noj 21 java maven-2

我有一个场景,其中我的项目需要在不同的JDK中编译,并且根据所使用的JDK,生成的工件名称应该是不同的.例如,如果项目名称是MyProject并且我调用mvn install,那么它需要在JDK 1.4以及JDK 1.5中编译,最后我得到两个相同项目的jar(MyProjectJDK14-1.0和MyProjectJDK15-1.0).有可能实现这个目标吗?

Pas*_*ent 35

Maven的方法不是改变finalName工件,而是使用分类器.例如:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <classifier>${envClassifier}</classifier>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
  <profiles>
    <profile>
      <id>jdk16</id>
      <activation>
        <jdk>1.6</jdk>
      </activation>
      <properties>
        <envClassifier>jdk16</envClassifier>
      </properties>
    </profile>
    <profile>
      <id>jdk15</id>
      <activation>
        <jdk>1.5</jdk>
      </activation>
      <properties>
        <envClassifier>jdk15</envClassifier>
      </properties>
    </profile>
  </profiles>
</project>
Run Code Online (Sandbox Code Playgroud)

${finalName}-${envClassifier}.jar使用以下语法命名JAR工件并将其作为依赖项包含在内:

<dependency>
  <groupId>com.mycompany</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0</version>
  <classifier>jdk16</classifier>
</dependency>
Run Code Online (Sandbox Code Playgroud)

你必须两次调用Maven构建来生成两个罐子(一个体面的CI引擎可以做到这一点).


Rom*_*las 7

您可以做的是定义两个配置文件,每个JDK使用一个配置文件.将激活关于使用哪个JDK的每个配置文件:

<profiles>
    <profile>
        <id>profile-for-jdk1.4</id>
        <activation>
            <activeByDefault>false</activeByDefault>
            <jdk>1.4</jdk>
        </activation>
        <build>
            <finalName>myBuild-jdk1.4</finalName>
        </build>
    </profile>
    <profile>
        <id>profile-for-jdk1.5</id>
        <activation>
            <activeByDefault>false</activeByDefault>
            <jdk>1.5</jdk>
        </activation>
        <build>
            <finalName>myBuild-jdk1.5</finalName>
        </build>
    </profile>
</profiles>
Run Code Online (Sandbox Code Playgroud)

然后,在每个配置文件中,您定义一个特定的<finalName>,用于命名生成的JAR文件.

因此,如果使用JDK 1.4构建应用程序,则会生成生成的JAR myBuild-jdk1.4.jar.

如果您的最终包是使用程序集构建的,则只需更改<build>配置文件内部的块以配置程序集插件(例如<finalName>).


关于你的评论:事实上,这个过程需要在Maven上有两个独立的构建,因为你必须在更改JDK版本时重新编译整个项目.Maven2约定之一是一个项目=一个工件.你想要的是有一个带有两个工件的项目.

最终,一个解决方案是使用Hudson构建您的应用程序,尤其是此工具的矩阵功能,它允许您使用各种参数运行多个构建,在您的情况下是JDK.