You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Java sun tools作为常规Gradle依赖导入以使用Compiler Tree API?

更优的Gradle配置方案适配Compiler Tree API依赖

下面提供几个兼容性更强的方案,覆盖JDK 8到JDK 17+的场景:

方案1:使用Gradle Java Toolchains(推荐,Gradle 6.7+)

Gradle的Java Toolchains可以自动识别当前项目使用的JDK,自动适配tools相关依赖,无需硬编码路径:

在build.gradle(Groovy)中配置:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(8) // 可根据你的需求调整版本
    }
}

dependencies {
    // 对于JDK 8,自动引入tools.jar;JDK 9+自动关联对应模块
    compileOnly files(javaToolchains.launcherFor(java.toolchain).getMetadata().infrastructureDirectory.resolve("../lib/tools.jar").toFile())
}

如果是Kotlin DSL(build.gradle.kts):

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(8)
    }
}

dependencies {
    val launcher = javaToolchains.launcherFor(java.toolchain).get()
    val toolsJar = launcher.metadata.infrastructureDirectory.resolve("../lib/tools.jar").toFile()
    compileOnly(files(toolsJar))
}

这个方案会自动根据你指定的JDK版本去寻找对应的tools依赖,避免了硬编码路径带来的跨平台(比如Windows和Linux的路径差异)、JDK安装路径不同的问题。

方案2:按JDK版本做条件依赖

如果你的项目需要兼容更老的Gradle版本,可以通过判断当前JDK版本来选择依赖方式:

Groovy版本:

def javaVersion = JavaVersion.current()

dependencies {
    if (javaVersion.isJava8()) {
        compileOnly files("${System.properties['java.home']}/../lib/tools.jar")
    } else if (javaVersion.isJava9Compatible()) {
        // JDK 9+中tools的API被纳入jdk.compiler模块
        compileOnly module("jdk.compiler")
        compileOnly module("jdk.javadoc") // 如果需要javadoc相关API
    }
}

Kotlin DSL版本:

val javaVersion = JavaVersion.current()

dependencies {
    if (javaVersion.isJava8) {
        compileOnly(files("${System.getProperty("java.home")}/../lib/tools.jar"))
    } else if (javaVersion.isJava9Compatible) {
        compileOnly(module("jdk.compiler"))
        compileOnly(module("jdk.javadoc"))
    }
}

这个方案手动区分了JDK 8和9+的依赖方式,解决了JDK模块化后tools.jar被拆分的问题,同时保留了对旧版本JDK的支持。

补充说明

  • 为什么group: 'com.sun', name: 'tools', version: '1.8'不生效?因为官方从未将tools.jar发布到Maven中央仓库,第三方仓库的该依赖可能存在合法性或版本匹配问题,Gradle无法可靠拉取。
  • 注解处理器场景下,建议使用compileOnly而非compile,避免将tools依赖传递到最终产物中。

内容的提问来源于stack exchange,提问作者Adams.H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:46:01