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

标签 java gradle build.gradle

我有使用 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"
        }
    }
}

我曾尝试在子项目中强制执行源兼容性,但似乎没有效果。

更新:

我创建了一个多模块 gradle 项目示例,其中一个子项目使用 Java 6,另一个子项目使用 Java 8。我在 org.gradle.java.home 中使用了属性 gradle.properties 为每个子项目设置 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/

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,它们对每个项目都有很好的值(value)。

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

关于java - Gradle:具有不同源和目标兼容性的多项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35297541/

相关文章:

gradle - 在 build.gradle 中如何提取和重用 Maven 存储库配置?

java - Instant.readObject 方法 "Defend[s] against malicious streams"是什么意思?

react-native - Gradle:无法初始化类 org.codehaus.groovy.runtime.InvokerHelper

java - 在RestClient中,RxJava与Android中的Observable配合不佳

android - 错误 :Execution failed for task ':app:prepareDebugAndroidTestDependencies' . > 依赖性错误。详情见控制台

android - android 项目中的 build.gradle 文件在哪里?

java - 安卓如何获取DeviceID?

java - SpringBoot中找不到EntityManagerFactory

java - 从应用程序获取 JRE 版本

gradle - 试图了解最简单的Gradle插件