使用maven编译不同版本的jdk的jar

时间:2014-07-02 01:04:46

标签: java maven

我的客户端jar需要用jdk 1.5和jdk 1.6编译。我想保持相同的artifactId和版本。我计划使用maven分类器从nexus下载工件。虽然我使用jdk5配置文件来构建jar(mvn clean install -Pjdk5),但通过查看清单文件,我发现了这一点 - Build-Jdk: 1.6.0_51

  • 是jar的清单文件,它会告诉jdk版本编译了哪个工件?
  • 如何使用一个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>
    

2 个答案:

答案 0 :(得分:1)

清单条目(Build-Jdk)不要告诉用于编译的jdk而是$ {java.version}。要在2个罐子中使用不同的清单,最简单的是编写自己的(2 *)清单。

maven doc: Manifest

您可以在没有配置文件的情况下在一个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上的sourcetarget设置只是设置源代码验证以及它的目标最小目标运行时间。因此,在您的情况下,我建议您将源和目标都设置为1.5

如果你真的需要用jdk5和6编译,那么你可以将你的JAVA_HOME env var设置为相应的jdk安装并为每个版本运行你的maven命令。

如果要检查它,请在编译之前在命令提示符下执行mvn -version。它会告诉你使用了什么jdk版本