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
相关产品推荐
相关产品推荐

