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

时间:2014-03-27 08:06:19

标签: java groovy gradle

由于我的Java源代码和目标必须兼容JRE 1.6,因此我需要将options.bootClasspath设置为包含1.6版rt.jarjce.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"
  }
}

5 个答案:

答案 0 :(得分: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
        }
    }
}

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

使用options.fork = true时需要bootClasspath

答案 1 :(得分:2)

接受的答案可以工作,但是如果您使用java.lang之外的某些类(例如javax.crypto.*),您可能会发现您将获得各种ClassNotFoundExceptionException以及更多需要将JAR文件添加到bootClasspath。

为避免这种情况,我使用以下优点;

tasks.withType(JavaCompile) {
    doFirst {
        if (JavaVersion.toVersion(sourceCompatibility) == JavaVersion.VERSION_1_6
            && JavaVersion.current() != JavaVersion.VERSION_1_6
            && System.env.JDK6_HOME != null) {
            options.fork = true
            options.bootClasspath = fileTree(include: ['*.jar'], dir: "$System.env.JDK6_HOME/jre/lib/").join(File.pathSeparator)
            options.extensionDirs = "$System.env.JDK6_HOME/jre/lib/ext/"
        }
    }
}

答案 2 :(得分:0)

Oleg Estekhin稍微修改了很酷的解决方案,但并不需要设置JDKX_HOME(即时计算)。另外,修改了Java 1.7版本:

tasks.withType(JavaCompile) {
    doFirst {
        if (sourceCompatibility == '1.7') {
            def JDK7_HOME = "/usr/libexec/java_home -v 1.7".execute().text.trim()
            options.bootClasspath = "$JDK7_HOME/jre/lib/rt.jar"
            options.bootClasspath += "$File.pathSeparator$JDK7_HOME/jre/lib/jsse.jar"
            // use the line above as an example to add jce.jar 
            // and other specific JDK jars
        }
    }
}

答案 3 :(得分:0)

我尝试使用上面的说明向我的bootClassPath添加许多jar,但从未解决我的构建问题。我最终解决了构建问题,方法是将我的JAVA_HOME设置为指向WebSphere服务器所需的IBM JDK 1.7并将其添加到我的路径中。我的其他项目需要Oracle JDK 1.8,所以我不想让这个更改永久化。

set JAVA_HOME="C:\Program Files (x86)\IBM\WebSphere\AppServer\java_1.7.1_64\"
set PATH=%JAVA_HOME%\bin;%PATH%
gradle clean war
gradle clean ear deployLocal

答案 4 :(得分:0)

从Gradle 4.3开始,您可以使用CompileOptions.bootstrapClasspath来取消对依赖于操作系统的分隔符的需求。