2016-02-04 51 views
0

我的应用程序在Java 1.6u45和Java 1.8的用户之间分开。我们的问题是我们不能指定项目系统库,并且同时为代码提供两种不同的编译器设置。Maven使用不同的JDK版本编译

项目结构:

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系统库

+1

您只能从它制作两个单独的Maven项目,为项目中的Maven编译器进行相应的配置,并通过父项(这称为多模块构建)进行组合。除此之外,任何IDE都无法正常工作..只有分开的项目才能工作。 – khmarbaise

+0

您可以尝试使用配置文件并运行构建两次,每个配置文件一次。也许不是最优雅的。像Go这样的现代CI应该允许您在假设有足够节点的情况下并行运行构建。 – Gavin

+0

我很感激帮助! 现在我只是将JVM中的说法,当我做生产版本: MVN清洁套装-Dmaven.compiler.source = 1.6 -Dmaven.compiler.target = 1.6 和保持我的pom.xml在配置适合我的IDE –

回答

1

我最近了解了toolchains.xml。 Maven甚至有文档记录并支持2.0.9!见toolchains documentation

所以我增加了一个toolchain.xml文件到我的〜/ .m2目录/文件夹下面的内容:

<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> 

它允许你定义什么不同的JDK Maven可以用它来无论构建项目JDK Maven运行。有点像在IDE中的项目级定义JDK时。当我需要使用Java 7构建另一个项目,而将Java 8作为默认项目时,我使用它。

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

相关问题