我的客户端jar需要用jdk 1.5和jdk 1.6编译。我想保持相同的artifactId和版本。我计划使用maven分类器从nexus下载工件。虽然我使用jdk5
配置文件来构建jar(mvn clean install -Pjdk5
),但通过查看清单文件,我发现了这一点 - Build-Jdk: 1.6.0_51
如何使用一个maven构建命令获取两个工件?
<profiles>
<profile>
<id>jdk5</id>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
<fork>true</fork>
<executable>${JAVA_HOME}/bin/javac</executable>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classifier>jdk5</classifier>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jdk6</id>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<fork>true</fork>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classifier>jdk6</classifier>
</configuration>
</plugin>
</plugins>
</build>
</profile>
答案 0 :(得分:1)
清单条目(Build-Jdk)不要告诉用于编译的jdk而是$ {java.version}。要在2个罐子中使用不同的清单,最简单的是编写自己的(2 *)清单。
您可以在没有配置文件的情况下在一个mvn命令中执行此操作(注意:从一个pom生成两个工件是不好的做法)
你必须加倍编译器,jar(或其他包装)和资源插件 此示例生成除默认(jdk1.7)jar之外的jdk1.8 jar(带分类器)。
小心我使用绝对路径指向2 jdk bin路径,这在连续集成开发项目中不起作用。
maven doc:Compiling Sources Using A Different JDK
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.erbre.test</groupId>
<artifactId>multi-compilation</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<source>1.7</source>
<target>1.7</target>
<fork>true</fork>
<executable>C:\Program Files\Java\jdk1.7.0_79\bin\javac</executable>
</configuration>
</execution>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
<configuration>
<source>1.7</source>
<target>1.7</target>
<fork>true</fork>
<executable>C:\Program Files\Java\jdk1.7.0_79\bin\javac</executable>
</configuration>
</execution>
<execution>
<id>default-compile-jdk1.8</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<fork>true</fork>
<outputDirectory>${project.build.outputDirectory}_jdk1.8</outputDirectory>
<executable>C:\Program Files\Java\jdk1.8.0_45\bin\javac</executable>
<source>1.7</source>
<target>1.8</target>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>default-package</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
<execution>
<id>default-package-jdk1.8</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>${project.build.outputDirectory}_jdk1.8</classesDirectory>
<classifier>jdk1.8</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>default-testResources</id>
<phase>process-test-resources</phase>
<goals>
<goal>testResources</goal>
</goals>
</execution>
<execution>
<id>default-resources</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
<execution>
<id>default-resources-jdk1.8</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.outputDirectory}_jdk1.8</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
答案 1 :(得分:0)
您是否考虑过使用jdk 5编译的二进制文件将与jre 6或更高版本兼容?较新的jre版本始终运行使用较旧的jdk版本编译的二进制文件。
maven-compiler-plugin上的source
和target
设置只是设置源代码验证以及它的目标最小目标运行时间。因此,在您的情况下,我建议您将源和目标都设置为1.5
如果你真的需要用jdk5和6编译,那么你可以将你的JAVA_HOME env var设置为相应的jdk安装并为每个版本运行你的maven命令。
如果要检查它,请在编译之前在命令提示符下执行mvn -version
。它会告诉你使用了什么jdk版本