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

因为我的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" } } 

我使用以下代码(假设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 } } } 

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

使用bootClasspath时需要options.fork = true

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

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

  • 仅在需要时才设置选项
  • 所有JAR文件都添加到bootClasspath中
  • extensionDirs也已设置(参见http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#extdirs-option )

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

稍微修改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 } } } 

我尝试使用上面的说明向我的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 

从Gradle 4.3开始,您可以使用CompileOptions.bootstrapClasspath来删除对依赖于OS的分隔符的需求。