java - 不同JDK版本的Maven编译

标签 java eclipse maven javafx maven-compiler-plugin

我的应用程序分为使用 Java 1.6u45 和 Java 1.8 的用户。我们的问题是,我们无法指定项目系统库,并且代码同时有两种不同的编译器设置。

项目结构:

Project >
    > src/main/java/com/us/javafx/... (Java 8 code)
    > src/main/java/com/us/... (Java 6 code)
    > src/main/resources/...

我们的 POM.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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.us</groupId>
   <artifactId>PROJECT</artifactId>
   <version>1.0.0</version>
   <packaging>jar</packaging>
   <name>PROJECT</name>
   <description>DESCR</description>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>

</dependencies>

<build>
    <plugins>
        <!-- Copy all dependencies to jars directory -->
          <plugin> 
              <artifactId>maven-dependency-plugin</artifactId> 
                  <executions> 
                      <execution> 
                          <phase>package</phase> 
                          <goals> 
                              <goal>copy-dependencies</goal> 
                          </goals> 
                          <configuration> 
                              <outputDirectory>${project.build.directory}/jars</outputDirectory> 
                          </configuration> 
                      </execution> 
                  </executions> 
          </plugin>


            <!-- Maven Compiler -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>  
                <configuration>
                    <!-- Necessary to avoid setting JRE on Maven project update! -->
                    <!-- SEE PHOTO FOR WHY THIS IS HERE -->
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>            
                <executions>

                    <!-- Compile Java 6 directory -->
                    <execution>
                        <id>java6</id>
                        <configuration>
                            <excludes>
                                <exclude>com/us/javafx/**/*</exclude>
                            </excludes>
                            <!-- Non working attempt to set compiler version -->
                            <source>1.6</source>
                            <target>1.6</target>
                        </configuration>
                    </execution>

                    <!-- Compile Java 8 directory -->
                    <execution>
                        <id>java8</id>
                        <configuration>
                            <includes>
                                <include>com/us/javafx/**/*</include>
                            </includes>
                            <!-- Non working attempt to set compiler version -->
                            <source>1.8</source>
                            <target>1.8</target>
                        </configuration>
                    </execution>

                </executions>
            </plugin>

            <!-- Create JAR in jars folder -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <outputDirectory>${project.build.directory}/jars</outputDirectory> 
                </configuration>
              </plugin>

        </plugins>
</build>

如果我们告诉 Maven 编译器插件使用 Java 1.8,Java 1.6 用户会收到不支持的主要次要版本错误。或者我们告诉 Maven 编译器插件使用 Java 1.6,但我们的 Java 8 代码在执行右键单击项目 > Maven > 更新项目...时会提示错误(这会导致下面的屏幕截图):

enter image description here

有没有一种方法可以实现这两个目标:

1) 使用各自的编译器编译 Java 6 和 8 代码

2)选择Java 8作为我们项目的JRE系统库

最佳答案

我最近了解了toolchains.xml。 Maven 甚至对其进行了记录并从 2.0.9 开始支持它!请参阅toolchains documentation

因此,我在 ~/.m2/文件夹中添加了一个 toolchain.xml 文件,其中包含以下内容:

<toolchains xmlns="http://maven.apache.org/TOOLCHAINS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/TOOLCHAINS/1.1.0 http://maven.apache.org/xsd/toolchains-1.1.0.xsd">
 <!-- JDK toolchains -->
 <toolchain>
   <type>jdk</type>
   <provides>
     <version>1.8</version>
     <vendor>sun</vendor>
   </provides>
   <configuration>
     <jdkHome>/opt/java8</jdkHome>
   </configuration>
 </toolchain>
 <toolchain>
   <type>jdk</type>
   <provides>
     <version>1.7</version>
     <vendor>sun</vendor>
   </provides>
   <configuration>
     <jdkHome>/opt/java7</jdkHome>
   </configuration>
 </toolchain>
</toolchains>

它允许您定义 Maven 可以使用哪些不同的 JDK 来构建项目,而不管 Maven 使用什么 JDK 运行。有点像在 IDE 中在项目级别定义 JDK。当我需要使用 Java 7 构建另一个项目并默认使用 Java 8 时,我使用了它。

我想这可以解决您的问题。

关于java - 不同JDK版本的Maven编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35209975/

相关文章:

java - Maven:针对 Java 1.4 构建代码,但针对 Java 1.5 构建测试代码

java - 在 java arraylist 中搜索正则表达式

java - 模拟无状态 session bean 会给出 javax.naming.NoInitialContextException

eclipse - 更改 eclipse 中的注释背景颜色?

java - 无法在 Eclipse 上配置 cofoja

maven - 我可以在 Gradle 中使用 Maven 插件(发音)吗?

java - 出于安全目的,如果以某种方式编写代码,是否有办法使代码失败?

Java Applet/Javascript - 通过网络打印 pdf 时如何操作打印设置?

java - Java 中的 GridView

java - Eclipse tycho 将版本更新为 svn 修订版