java – Gradle:具有不同源和目标兼容性的多项目

我有多项目gradle配置,它使用
java 7进行构建.我正在添加一个必须使用
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"
        }
    }
}

我试图在子项目中提供源兼容性,但似乎这没有效果.

更新:

我创建了一个多模块gradle项目的示例,其中一个子项目使用Java 6,另一个使用Java 8.我在gradle.properties中使用了org.gradle.java.home属性,用于每个子项目为每个人设置Java主页.这是github repo.

子项目包含使用Java 8中的Apis的每个类,使用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/

build.gradle for java 8子项目:

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/

我正在打印sourceCompatibility和targetCompatibility,它们具有每个项目的良好值.

我正在使用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.

提前致谢,

最佳答案 我引用了gradle论坛的答案:

您无法在每个项目级别更改java.home,因为它适用于整个多项目构建.

设置编译器的源级别只会影响您可以使用的语言功能(例如Lambdas).它对API没有影响.这与Gradle无关,即使你直接运行javac也是如此.要确保您没有使用错误的API,您必须设置编译任务的bootClasspath.

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