2016-02-04 79 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作爲默認項目時,我使用它。

我想這可以解決您的問題。

相關問題