Gerrit Brouwer Gerrit Brouwer - 1 month ago 29
Java Question

How to set Gradle `options.bootClasspath` in an os independent manner?

Because my Java sources and targets must be JRE 1.6 compatible, I need to set

options.bootClasspath
to a path that contains the 1.6 versions of
rt.jar
and
jce.jar
. It must build on both Windows and Unix (Linux/Solaris). What is the proper way to do this? I now use the following approach in my top-level
build.gradle
, it works, but it seems far from elegant, especially the os-dependent separator
:
or
;
:

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"
}
}

Answer

I am using the following code (assuming the JDK6_HOME points to the root of the JDK 1.6 installation):

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
        }
    }
}

This approach automatically detects the presence of the environment variable and automatically sets the bootClasspath for all modules that declare sourceCompatibility as 1.6.

The options.fork = true is required when you use bootClasspath.