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

JDK 11中tools.jar缺失原因、相关文档及高版本情况咨询

JDK 11中tools.jar相关问题解答

1. 为何JDK 11中移除了tools.jar文件?

JDK 11延续了JDK 9启动的**模块化(Project Jigsaw)**改造,tools.jar作为传统JDK中聚合编译、调试等工具类的胖jar包,被拆分到多个独立的JDK模块中,因此不再保留单独的tools.jar文件。

2. 移除tools.jar的原因及相关问题解决方案

移除原因

核心原因是模块化改造的需求:

  • 传统的tools.jar包含大量工具类(如javac编译器、javap反编译器、调试工具类等),属于无结构的聚合包,不符合模块化的设计理念。
  • 模块化后,这些工具类被拆分到jdk.compiler、jdk.javadoc、jdk.jdeps等专用模块中,每个模块职责单一,减少冗余,提升JDK的可维护性和加载效率。

预期问题与解决方案

问题1:旧代码直接引用tools.jar路径导致编译/运行报错

比如代码中硬编码了tools.jar的路径,或者构建脚本(如Ant、Maven)中显式依赖该jar包。
解决方案:

  • 改用模块化依赖:在编译或运行时通过--add-modules参数引入对应模块,例如需要编译器功能时添加--add-modules jdk.compiler。
  • 示例命令:
    javac --add-modules jdk.compiler MyCompiler.java
    
  • 对于构建工具,以Maven为例,可通过maven-compiler-plugin指定JDK版本并自动处理模块依赖:
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.11.0</version>
        <configuration>
            <release>11</release>
        </configuration>
    </plugin>
    

问题2:反射或直接加载tools.jar中的类失败

比如旧代码通过URLClassLoader加载tools.jar中的com.sun.tools.javac.api.JavacTool类。
解决方案:

  • 使用Java标准服务接口获取工具实例,例如通过ServiceLoader加载JavaCompiler:
    import javax.tools.JavaCompiler;
    import java.util.ServiceLoader;
    
    public class CompilerExample {
        public static void main(String[] args) {
            ServiceLoader<JavaCompiler> loader = ServiceLoader.load(JavaCompiler.class);
            JavaCompiler compiler = loader.findFirst().orElseThrow(() -> new IllegalStateException("No compiler available"));
            // 使用compiler进行编译操作
        }
    }
    

3. 更高版本JDK中是否重新添加了tools.jar?

从JDK 9启动模块化改造后,所有后续版本(JDK 10、11、12直到最新的JDK 21等)都没有重新添加tools.jar。相关工具类始终以模块化的形式存在于对应的JDK模块中,保持了模块化的架构设计。

内容的提问来源于stack exchange,提问作者Adrenaline360

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:16:02