首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以独立于操作系统的方式设置Gradle `options.bootClasspath`?

如何以独立于操作系统的方式设置Gradle `options.bootClasspath`?
EN

Stack Overflow用户
提问于 2014-03-27 08:06:19
回答 4查看 11.4K关注 0票数 22

因为我的Java源代码和目标必须与JRE1.6兼容,所以我需要将options.bootClasspath设置为包含1.6个版本的rt.jarjce.jar的路径。它必须同时建立在Windows和Unix (Linux/Solaris)之上。做这件事的正确方法是什么?现在,我在我的顶级build.gradle中使用了下面的方法,它可以工作,但它看起来很不优雅,特别是依赖os的分隔符:;

代码语言:javascript
复制
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"
  }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-27 08:21:49

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

代码语言:javascript
复制
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为1.6的所有模块设置sourceCompatibility

使用options.fork = true时需要bootClasspath

票数 28
EN

Stack Overflow用户

发布于 2017-01-13 11:22:57

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

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

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

代码语言:javascript
复制
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/"
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2017-11-01 13:49:36

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22681544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档