2016-02-09 99 views
3

我具有被用java 7用於構建多項目的gradle配置。我補充說,必須與Java 6搖籃:多項目具有不同的源和目標兼容性

建立從這個Q&A我曾嘗試提出了不同的解決方案,但沒有一次成功的新項目。

這裏是頂級的build.gradle:

allprojects { 
    apply plugin: 'idea' 
    apply plugin: 'java' 


    repositories { 
     maven { url 'http://repo1.maven.org/maven2' } 
     mavenLocal() 
    } 

    sourceCompatibility = 1.7 
    targetCompatibility = 1.7 

    gradle.projectsEvaluated { 
     tasks.withType(JavaCompile) { 
      options.compilerArgs << "-Xlint:-options" 
     } 
    } 
} 

我試圖enfore表示在兒童項目源兼容性,但似乎沒有任何效果。

更新

我已創建多模塊項目的gradle的一個例子使用Java 6子項目中的一個和另一個的java 8.我已經使用org.gradle.java.home屬性在gradle.properties爲每個子項目爲每個項目設置Java主頁。這裏是github repo

項目中的子項目包含使用API​​從Java 8每一個類,用java 6子項目預期失敗,但構建成功運行。

這裏是父的build.gradle文件:

group 'com.test' 
version '1.0-SNAPSHOT' 
repositories { 
    mavenCentral() 
} 

父settings.gradle的內容:

rootProject.name = 'Parent' 
include 'child2Java6' 
include 'child1Java8' 

Java 6的子項目的build.gradle內容:

group 'com.test' 
version '1.0-SNAPSHOT' 

apply plugin: 'java' 

sourceCompatibility = JavaVersion.VERSION_1_6 
targetCompatibility = JavaVersion.VERSION_1_6 
repositories { 
    mavenCentral() 
} 
compileJava.doFirst { 
    println "source compatibility " + sourceCompatibility 
    println "target compatibility " + targetCompatibility 
} 
dependencies { 
    testCompile group: 'junit', name: 'junit', version: '4.11' 
} 

Java 6子項目的gradle.properties的內容:

org.gradle.java.home=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/ 

對Java 8個子項目的build.gradle:

group 'com.test' 
version '1.0-SNAPSHOT' 

apply plugin: 'java' 


sourceCompatibility = JavaVersion.VERSION_1_8 
targetCompatibility = JavaVersion.VERSION_1_8 
repositories { 
    mavenCentral() 
} 
compileJava.doFirst { 
    println "source compatibility " + sourceCompatibility 
    println "target compatibility " + targetCompatibility 
} 

dependencies { 
    testCompile group: 'junit', name: 'junit', version: '4.11' 
} 

它的gradle.properties:

org.gradle.java.home=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/ 

我打印sourceCompatibilitytargetCompatibility,他們會爲每個好的價值觀項目。

我使用gradle clean build建設。

gradle -v輸出這樣的:

------------------------------------------------------------ 
Gradle 2.9 
------------------------------------------------------------ 

Build time: 2015-11-17 07:02:17 UTC 
Build number: none 
Revision:  b463d7980c40d44c4657dc80025275b84a29e31f 

    Groovy:  2.4.4 
    Ant:   Apache Ant(TM) version 1.9.3 compiled on December 23 2013 
    JVM:   1.8.0_65 (Oracle Corporation 25.65-b01) 
    OS:   Mac OS X 10.11.1 x86_64 

我使用Java 8作爲我的默認JDK。

由於提前,

回答

1

我引用我從gradle這個論壇得到了答案:

你不能改變在每個項目級別java.home,因爲它適用於整個多項目構建。

設置編譯器的源級別只會影響您可以使用的語言功能(例如Lambdas)。它對API沒有影響。這與Gradle無關,即使直接運行javac也是如此。爲了確保你沒有使用錯誤的API,你必須設置編譯任務的bootClasspath。

tasks.withType(JavaCompile) { 
    options.fork = true 
    options.bootClasspath = "path/to/rt.jar" 
} 
1

類似於其他編程語言,搖籃有許多方法來完成相同的任務。在多項目構建中按項目定義特定的插件或依賴項可以保持構建的獨立性,並有望創建更多可維護的代碼。

從搖籃文檔Chapter 11 Section 2

您也可以將屬性使用屬性 文件添加到您的項目對象。您可以將Gradle.properties文件放置在Gradle用戶主目錄 目錄(由「GRADLE_USER_HOME」環境變量定義, ,如果未將缺省值設置爲USER_HOME/.gradle)或在項目 目錄中。對於多項目構建,您可以將gradle.properties 文件放在任何子項目目錄中。可以通過項目對象訪問設置在 gradle.properties文件中的屬性。用戶主目錄中的 屬性文件優先於項目目錄中的 屬性文件。

這意味着在每個子項目gradle.properties文件中,您可以定義項目將使用的Java版本或其他依賴項。在您的搖籃項目根gradle.properties文件中設置搖籃Java版本的一個例子是:

org.gradle.java.home=/path_to_jdk_7 

在你的子項目gradle.properties文件中,可以有類似的東西:

com.myproject.app=/path_to_jdk_6 

UPDATE

Gradle提供了一些工具來關注子項目。通過在父項build.gradle中包含以下內容,可以調用一項任務來打印子項目及其父母。

allprojects { 
    task versioner << {task -> println "Loaded: $task.project.name"} 
} 
subprojects { 
    versioner << {println " - Depends on parent"} 
} 

爲了驗證的Java版本是不同的,你可以通過JavaExec嘗試運行從子項目的一類。這可以在孩子被稱爲項目build.gradle文件,如下所示:

task runApp(type: JavaExec) { 

    classpath = sourceSets.main.runtimeClasspath 

    //make sure the path points to project's java class being called 
    main = "com.test.MainClass" 
} 
+0

感謝我想會給你反饋 –

+0

我已經加入到我的subroject gradle.properties但似乎不工作org.gradle.java.home = /圖書館/的Java/JavaVirtualMachines/1.6.0 .jdk/Contents/Home –

+0

您是否通過註釋'repositories'後的項目並在root'gradle.properties'文件中聲明JAVA版本來清除頂層'build.gradle'? – Nathan