如何以os独立方式设置Gradle`options.bootClasspath`?

Ger*_*wer 20 java groovy gradle

因为我的Java源代码和目标必须是JRE 1.6兼容的,所以我需要设置options.bootClasspath一个包含1.6版本rt.jar和的路径jce.jar.它必须建立在Windows和Unix(Linux/Solaris)上.这样做的正确方法是什么?我现在在我的顶层使用以下方法build.gradle,它可以工作,但它似乎远非优雅,尤其是依赖于os的分隔符:;:

import org.apache.tools.ant.taskdefs.condition.Os

subprojects {
  apply plugin: 'java'

  compileJava {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
    def java6_home = System.getenv("JAVA_HOME_6")
    def java6_lib = "C:/localdata/Program Files (x86)/Java/jdk1.6.0_45/jre/lib/"

    if (java6_home != null) {
      java6_lib = java6_home + "/jre/lib/"
    }

    def sep = ':'
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
      sep = ';'
    }
    options.bootClasspath = java6_lib + "rt.jar" + sep + java6_lib + "jce.jar"
  }
}
Run Code Online (Sandbox Code Playgroud)

Ole*_*hin 26

我使用以下代码(假设JDK6_HOME指向JDK 1.6安装的根目录):

tasks.withType(JavaCompile) {
    doFirst {
        if (sourceCompatibility == '1.6' && System.env.JDK6_HOME != null) {
            options.fork = true
            options.bootClasspath = "$System.env.JDK6_HOME/jre/lib/rt.jar"
            options.bootClasspath += "$File.pathSeparator$System.env.JDK6_HOME/jre/lib/jsse.jar"
            // use the line above as an example to add jce.jar 
            // and other specific JDK jars
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此方法自动检测环境变量的存在,并自动设置bootClasspath声明sourceCompatibility为1.6的所有模块.

options.fork = true当您使用需要bootClasspath.

  • 感谢名单!使用File.pathSeparator可以节省5行代码.但是,我怀疑是否需要`options.fork = true`.用户指南说:"默认情况下,Java编译器在Gradle进程中运行.将options.fork设置为true会导致编译在单独的进程中发生.对于Ant javac任务,这意味着新进程将是为每个编译任务分叉,这可能会减慢编译速度." (2认同)
  • http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.compile.CompileOptions.html#org.gradle.api.tasks.compile.CompileOptions:bootClasspath:仅在fork为时生效真正. (2认同)
  • 文档自2.6以来已经改变,因为它没有提到仅用`fork = true`生效.请参阅[Gradle 2.5文档](https://docs.gradle.org/2.5/dsl/org.gradle.api.tasks.compile.CompileOptions.html#org.gradle.api.tasks.compile.CompileOptions:bootClasspath)vs [Gradle 2.6 Documentation](https://docs.gradle.org/2.6/dsl/org.gradle.api.tasks.compile.CompileOptions.html#org.gradle.api.tasks.compile.CompileOptions:bootClasspath).没有尝试,但会做,并将报告调查结果. (2认同)