【问题标题】:Maven compiling with different JDK versions使用不同JDK版本编译的Maven
【发布时间】:2016-05-14 14:14:40
【问题描述】:

我的应用程序在 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 代码在执行 Right Click Project > Maven > Update Project... 时会报错(这会导致下面的屏幕截图):

有没有一种方法可以同时实现:

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

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

【问题讨论】:

  • 您只能从中创建两个单独的 maven 项目,为项目中的 maven-compiler 进行适当的配置,并通过父级组合它们(这称为多模块构建)。除此之外,在任何不能正常工作的 IDE 中......只有单独的项目才能工作。
  • 您可以尝试使用配置文件并运行构建两次,每个配置文件一次。也许不是最优雅的。假设有足够的可用节点,Go 等现代 CI 应该允许您并行运行构建。
  • 感谢您的帮助!现在我只是在进行生产构建时添加 JVM 参数: mvn clean package -Dmaven.compiler.source=1.6 -Dmaven.compiler.target=1.6 并将我的 POM.xml 保持在适合我的 IDE 的配置中
  • 正如 khmarbaise 评论的那样,唯一的方法是将 1.6 和 1.8 代码库分别拆分到自己的单独项目中。

标签: java eclipse maven javafx maven-compiler-plugin


【解决方案1】:

我最近了解了 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 时,我使用了它。

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

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多