我有一个场景,我的项目需要在不同的 JDK 中编译,并且生成的工件名称应该根据所使用的 JDK 不同。例如,如果项目名称是
MyProject
,我调用mvn install
,那么它需要在JDK 1.4
和JDK 1.5
中编译,最后我得到同一个项目的两个jar:MyProjectJDK14-1.0
和 MyProjectJDK15-1.0
。
有可能实现这个目标吗?
执行此操作的 Maven 方法不是更改工件的
finalName
,而是使用 classifier。例如:
<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>
JAR 工件将被命名为
${finalName}-${envClassifier}.jar
并使用以下语法作为依赖项包含在内:
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
<classifier>jdk16</classifier>
</dependency>
您必须调用 Maven 构建两次才能生成两个 jar(一个不错的 CI 引擎可以做到这一点)。
您可以做的是定义两个配置文件,每个使用的 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>
然后,在每个配置文件中,定义一个特定的
<finalName>
,它将用于命名生成的 JAR 文件。
因此,如果您使用 JDK 1.4 构建应用程序,生成的 JAR 将被命名为
myBuild-jdk1.4.jar
。
如果您的最终包是使用程序集构建的,您只需更改配置文件内的
<build>
块即可配置程序集插件(例如更改为 <finalName>
)。
关于您的评论: 事实上,这个过程需要在 Maven 上进行两次单独的构建,因为更改 JDK 版本时必须重新编译整个项目。 Maven2 约定之一是:一个项目 = 一个工件。您想要的是拥有一个包含两个工件的项目。
最终,一种解决方案是使用 Hudson 来构建您的应用程序,尤其是该工具的 matrix 功能,它允许您使用各种参数(在您的情况下为 JDK)运行多个构建。
使用 Maven 配置文件。将此部分添加到您的
project
的 pom.xml
标签内:
<profiles>
<profile>
<activation>
<jdk>1.4</jdk>
</activation>
<build>
<finalName>${project.artifactId}-${project.version}-JDK1.4</finalName>
</build>
</profile>
<profile>
<activation>
<jdk>1.5</jdk>
</activation>
<build>
<finalName>${project.artifactId}-${project.version}-JDK1.5</finalName>
</build>
</profile>
</profiles>
请参阅 this 了解有关配置文件的更多信息。
类似的问题是不同版本的 JDK 中使用的 JDBC api 的不同变体。
我认为这些需要不同的 arifactId,而不是分类器。
您可以通过在设置中设置一个属性,然后在artifactId标签中引用它来实现这一点:
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>throwing-jdbc-${jdbc.version}</artifactId>
<name>Throwing JDBC</name>
<profiles>
<profile>
<id>jdbc3</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>[1.3,1.4,1.5]</jdk>
</activation>
<properties>
<jdbc.version>3.0</jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<sources>
<source>src/jdbc3-variants/java</source>
</sources>
</configuration>
<executions>
<execution>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jdbc4</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.6</jdk>
</activation>
<properties>
<jdbc.version>4.0</jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<configuration>
<sources>
<source>src/jdbc4/java</source>
<source>src/jdbc4-variants/java</source>
</sources>
</configuration>
<executions>
<execution>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jdbc41</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<jdbc.version>4.1</jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<configuration>
<sources>
<source>src/jdbc4/java</source>
<source>src/jdbc4.1/java</source>
<source>src/jdbc4.1-variants/java</source>
</sources>
</configuration>
<executions>
<execution>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
实际上有一种方法可以通过一个构建生成多个 WAR(我猜这也适用于 JAR):您可以使用程序集插件,对不同的描述符进行多次执行。