解决Error:java: System Java Compiler was not found in classpath

本文介绍了一个在使用IntelliJ IDEA过程中遇到的Java编译错误:SystemJavaCompiler未找到,并给出了详细的异常堆栈跟踪。最终通过将项目设置中的编译器从IntelliJ改为Eclipse解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次使用intellij的时候碰到了一个这样的问题:
Error:java: System Java Compiler was not found in classpath:
java.lang.ClassNotFoundException: com.sun.tools.javac.api.JavacTool
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at org.jetbrains.jps.builders.impl.java.JavacCompilerTool.createCompiler(JavacCompilerTool.java:70)
    at org.jetbrains.jps.javac.JavacMain.compile(JavacMain.java:63)
    at org.jetbrains.jps.javac.ExternalJavacProcess.compile(ExternalJavacProcess.java:196)
    at org.jetbrains.jps.javac.ExternalJavacProcess.access$400(ExternalJavacProcess.java:48)
    at org.jetbrains.jps.javac.ExternalJavacProcess$CompilationRequestsHandler$1.run(ExternalJavacProcess.java:263)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

开始以为是环境变量配置的不对,结果搞了蛮久,最后解决方法如图:
这里写图片描述
将箭头标记的这个地方改为eclipse就好了。

### 解决 Java 编译错误:引导类路径未设置和注释处理问题 在开发过程中,如果遇到 `Java compilation failed internal java compiler error` 的情况,尤其是在使用 `-source 8` 参数时,可能涉及以下几个方面的原因及其对应的解决方案。 #### 1. **引导类路径未正确设置** 当编译器报告内部错误或找不到某些核心类时,通常是由于引导类路径 (`bootclasspath`) 设置不当所致。JDK 提供了一个选项用于显式指定引导类路径,即 `-Xbootclasspath/p:` 或者 `-Xbootclasspath/a:`[^1]。 - 如果您正在尝试覆盖标准库的行为(例如修改 String 实现),则需要提供自定义的核心类文件位置。 - 正确的做法是在命令行中加入完整的 JDK 安装目录下的 rt.jar (适用于较老版本的 JDK)。例如: ```bash javac -source 8 -target 8 -Xbootclasspath/p:C:\Program Files\Java\jdk1.8.0_XXX\lib\rt.jar BootApplication.java ``` 注意替换具体的 jdk 路径与版本号。 #### 2. **注解处理器冲突** 现代 IDEs 和构建工具链经常集成自动化的注解处理器插件,在这种情况下可能会因为不同版本间的不兼容性引起混乱。特别是 Spring Boot 应用程序中的 `@SpringBootApplication` 注解触发 APT (Annotation Processing Tool) 流程时容易出现问题[^2]。 为了排除干扰因素,建议临时禁用外部注解处理器再单独测试基本功能是否正常工作: ```properties # For Maven projects add this configuration into your pom.xml file under <build><plugins> section. <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <annotationProcessors /> </configuration> </plugin> ``` 或者直接通过 CLI 执行时不加载任何额外处理器: ```bash javac -proc:none -source 8 -target 8 BootApplication.java ``` #### 3. **源代码语法不符合目标级别要求** 即使指定了 `-source 8` ,但如果实际编写的内容包含了更高级别的特性(比如 lambda 表达式、try-with-resources 等),仍然会出现解析失败的现象。因此务必保证整个项目遵循统一的标准[^3]。 可以通过以下方式检查潜在违规项: - 删除所有高阶 API 调用; - 替换 Lambda 函数为匿名内部类形式; - 明确声明变量类型而非利用 var 关键字推断; 最终简化后的样例代码如下所示: ```java public class BootApplication { public static void main(String[] args){ System.out.println("Hello World"); } } ``` 重新编译上述简单实例以验证基础环境搭建无误后再逐步恢复复杂逻辑结构。 --- ### 总结 综上所述,解决此类编译错误的关键在于合理配置引导类路径参数、谨慎管理注解处理器行为以及严格控制源码书写风格的一致性。按照以上步骤逐一排查即可定位根本原因并实施针对性修正方案。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值