Maven编译打包报错:java.lang.NoClassDefFoundError:com.sun.tools.javac.code.TypeTags

问题描述:

    使用Ideal自带的terminal执行maven打包命令成功,但是使用Mac自带的terminal打包报错:java.lang.NoClassDefFoundError:com.sun.tools.javac.code.TypeTags

解决过程:

    中间走了很多弯路,ideal的terminal编译打包直接使用的是maven的命令,而在Mac打包使用的是封装了maven命令的shell脚本,一度以为是脚本的问题,各种无用的操作和排查后发现根本没用,后来各种碰壁后发现了问题:原来之前在修改elasticsearch源码的时候将jdk的版本升级到了jdk12,后来elasticsearch源码修改完毕后将jdk的版本改回了jdk8,但是那个窗口却一直没关闭,导致窗口缓存jdk的版本仍旧是12,编译提示上述的错误;而ideal的jdk版本修改后即时生效就不会有这些问题了,汗啊....

问题总结:

如果在各种场景下遇到上述问题或者报错,都可以优先考虑jdk的版本与相关的组件或者代码是否匹配或者兼容,八成都是这个问题。

 

配置了还是Can't initialize javac processor due to (most likely) a class loader problem: java.lang.NoClassDefFoundError: Could not initialize class lombok.javac.Javac at lombok.javac.apt.LombokProcessor.placePostCompileAndDontMakeForceRoundDummiesHook(LombokProcessor.java:174) at lombok.javac.apt.LombokProcessor.init(LombokProcessor.java:96) at lombok.core.AnnotationProcessor$JavacDescriptor.want(AnnotationProcessor.java:160) at lombok.core.AnnotationProcessor.init(AnnotationProcessor.java:213) at lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init(AnnotationProcessor.java:64) at org.netbeans.modules.java.source.indexing.APTUtils$ErrorToleratingProcessor.init(APTUtils.java:995) at com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.<init>(JavacProcessingEnvironment.java:623) at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:752) at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:846) at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$2200(JavacProcessingEnvironment.java:109) at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1189) at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1302) at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1272) at org.netbeans.lib.nbjavac.services.NBJavaCompiler.processAnnotations(NBJavaCompiler.java:64) at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1174) at com.sun.tools.javac.api.JavacTaskImpl.enter(JavacTaskImpl.java:348) at com.sun.tools.javac.api.JavacTaskImpl.enter(JavacTaskImpl.java:282) at org.netbeans.modules.java.source.parsing.JavacParser.moveToPhase(JavacParser.java:742) at org.netbeans.modules.java.source.parsing.CompilationInfoImpl.toPhase(CompilationInfoImpl.java:426) at org.netbeans.api.java.source.CompilationController.toPhase(CompilationController.java:90) at org.netbeans.modules.java.hints.infrastructure.JavaErrorProvider$1.run(JavaErrorProvider.java:108) at org.netbeans.modules.parsing.impl.TaskProcessor.callUserTask(TaskProcessor.java:586) at org.netbeans.modules.parsing.api.ParserManager$UserTaskAction.run(ParserManager.java:197) at org.netbeans.modules.parsing.api.ParserManager$UserTaskAction.run(ParserManager.java:180) at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:181) at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:178) at org.netbeans.modules.masterfs.filebasedfs.utils.FileChangedManager.priorityIO(FileChangedManager.java:153) at org.netbeans.modules.masterfs.providers.ProvidedExtensions.priorityIO(ProvidedExtensions.java:335) at org.netbeans.modules.parsing.nb.DataObjectEnvFactory.runPriorityIO(DataObjectEnvFactory.java:118) at org.netbeans.modules.parsing.impl.Utilities.runPriorityIO(Utilities.java:67) at org.netbeans.modules.parsing.impl.TaskProcessor.runUserTask(TaskProcessor.java:178) at org.netbeans.modules.parsing.api.ParserManager.parse(ParserManager.java:83) at org.netbeans.modules.java.hints.infrastructure.JavaErrorProvider.computeErrors(JavaErrorProvider.java:100) at org.netbeans.modules.java.lsp.server.protocol.TextDocumentServiceImpl.lambda$computeDiags$49(TextDocumentServiceImpl.java:2208) at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) at org.netbeans.modules.java.lsp.server.protocol.TextDocumentServiceImpl.computeDiags(TextDocumentServiceImpl.java:2213) at org.netbeans.modules.java.lsp.server.protocol.TextDocumentServiceImpl.lambda$runDiagnosticTasks$46(TextDocumentServiceImpl.java:2106) at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1403) at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45) at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287) at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2018) Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.NoSuchFieldException: com.sun.tools.javac.code.TypeTag :: UNKNOWN [in thread "pool-1-thread-1"] at lombok.permit.Permit.getField(Permit.java:144) at lombok.javac.JavacTreeMaker$SchroedingerType.getFieldCached(JavacTreeMaker.java:171) at lombok.javac.JavacTreeMaker$TypeTag.typeTag(JavacTreeMaker.java:259) at lombok.javac.Javac.<clinit>(Javac.java:186) at lombok.javac.apt.LombokProcessor.placePostCompileAndDontMakeForceRoundDummiesHook(LombokProcessor.java:174) at lombok.javac.apt.LombokProcessor.init(LombokProcessor.java:96) at lombok.core.AnnotationProcessor$JavacDescriptor.want(AnnotationProcessor.java:160) at lombok.core.AnnotationProcessor.init(AnnotationProcessor.java:213) at lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init(AnnotationProcessor.java:64) at org.netbeans.modules.java.source.indexing.APTUtils$ErrorToleratingProcessor.init(APTUtils.java:995) at com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.<init>(JavacProcessingEnvironment.java:623) at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:752) at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:846) at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$2200(JavacProcessingEnvironment.java:109) at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1189) at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1302) at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1272) at org.netbeans.lib.nbjavac.services.NBJavaCompiler.processAnnotations(NBJavaCompiler.java:64) at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1174) at com.sun.tools.javac.api.JavacTaskImpl.enter(JavacTaskImpl.java:348) at com.sun.tools.javac.api.JavacTaskImpl.enter(JavacTaskImpl.java:282) at org.netbeans.modules.java.source.parsing.JavacParser.moveToPhase(JavacParser.java:742) at org.netbeans.modules.java.source.parsing.CompilationInfoImpl.toPhase(CompilationInfoImpl.java:426) at org.netbeans.api.java.source.CompilationController.toPhase(CompilationController.java:90) at org.netbeans.modules.java.hints.infrastructure.JavaErrorProvider$1.run(JavaErrorProvider.java:108) at org.netbeans.modules.parsing.impl.TaskProcessor.callUserTask(TaskProcessor.java:586) at org.netbeans.modules.parsing.api.ParserManager$UserTaskAction.run(ParserManager.java:197) at org.netbeans.modules.parsing.api.ParserManager$UserTaskAction.run(ParserManager.java:180) at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:181) at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:178) at org.netbeans.modules.masterfs.filebasedfs.utils.FileChangedManager.priorityIO(FileChangedManager.java:153) at org.netbeans.modules.masterfs.providers.ProvidedExtensions.priorityIO(ProvidedExtensions.java:335) at org.netbeans.modules.parsing.nb.DataObjectEnvFactory.runPriorityIO(DataObjectEnvFactory.java:118) at org.netbeans.modules.parsing.impl.Utilities.runPriorityIO(Utilities.java:67) at org.netbeans.modules.parsing.impl.TaskProcessor.runUserTask(TaskProcessor.java:178) at org.netbeans.modules.parsing.api.ParserManager.parse(ParserManager.java:83) at org.netbeans.modules.java.hints.infrastructure.JavaErrorProvider.computeErrors(JavaErrorProvider.java:100) at org.netbeans.modules.java.lsp.server.protocol.TextDocumentServiceImpl.lambda$computeDiags$49(TextDocumentServiceImpl.java:2208) at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) at org.netbeans.modules.java.lsp.server.protocol.TextDocumentServiceImpl.computeDiags(TextDocumentServiceImpl.java:2213) at org.netbeans.modules.java.lsp.server.protocol.TextDocumentServiceImpl.codeAction(TextDocumentServiceImpl.java:1092) at jdk.internal.reflect.GeneratedMethodAccessor67.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint.lambda$null$0(GenericEndpoint.java:65) at org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint.request(GenericEndpoint.java:120) at org.eclipse.lsp4j.jsonrpc.RemoteEndpoint.handleRequest(RemoteEndpoint.java:261) at org.eclipse.lsp4j.jsonrpc.RemoteEndpoint.consume(RemoteEndpoint.java:190) at org.netbeans.modules.java.lsp.server.protocol.Server$ConsumeWithLookup$2.lambda$consume$0(Server.java:339) at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45) at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287) at org.netbeans.modules.java.lsp.server.protocol.Server$ConsumeWithLookup$2.consume(Server.java:337) at org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer.handleMessage(StreamMessageProducer.java:194) at org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer.listen(StreamMessageProducer.java:94) at org.eclipse.lsp4j.jsonrpc.json.ConcurrentMessageProcessor.run(ConcurrentMessageProcessor.java:113) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833)
08-28
<think>我们正在处理Java中的两个错误:`java.lang.ExceptionInInitializerError` 和 `com.sun.tools.javac.code.TypeTags`。首先,我们需要分别理解这两个错误,然后提供解决方案。 ### 1. `java.lang.ExceptionInInitializerError` 这个错误表示在静态初始化块或静态变量初始化期间发生了异常。当类被加载时,静态初始化块会执行,如果在此过程中抛出异常,JVM会将其包装为`ExceptionInInitializerError`。 **常见原因:** - 静态变量初始化时抛出异常(如空指针异常、除零异常等)。 - 静态初始化块(`static { ... }`)中有代码抛出异常。 - 依赖的静态资源不可用(如配置文件缺失、数据库连接失败)。 **解决步骤:** 1. 查看错误堆栈跟踪,找到引起错误的根本原因(通常是`Cause by`部分)。 2. 分析该根本原因,解决对应的静态初始化问题。 ### 2. `com.sun.tools.javac.code.TypeTags` 这个错误通常与编译器内部相关,出现在使用`com.sun.tools`包时。`TypeTags`是`javac`编译器内部使用的枚举类。出现该错误可能是因为: - 使用了不兼容的JDK版本(例如,代码编译时使用了高版本JDK,但运行时使用了低版本JDK,或者反之)。 - 项目依赖的tools.jar版本与运行环境JDK版本不一致。 - 在IDE中配置的JDK与项目构建路径中指定的JDK不一致。 **解决步骤:** 1. 确保编译和运行时使用相同版本的JDK。 2. 检查项目依赖,特别是与编译器相关的库(如tools.jar)是否与当前JDK版本匹配。 3. 如果使用了Maven/Gradle,检查依赖项中是否包含了不匹配的编译器相关依赖。 ### 综合解决方案 #### 步骤1:检查并统一JDK版本 - 在命令行中执行`java -version`和`javac -version`,确保二者版本一致。 - 在IDE(如IntelliJ IDEA或Eclipse)中,检查项目的SDK设置和模块的SDK是否一致。 #### 步骤2:查看堆栈跟踪定位问题 对于`ExceptionInInitializerError`,重点查看堆栈中的`Caused by:`部分,定位到具体的静态初始化代码。例如: ```java public class MyClass { static { // 这里可能抛出异常 int a = 1 / 0; // 例如,除以零导致ArithmeticException } } ``` #### 步骤3:检查静态初始化代码 - 检查静态变量初始化和静态块中的代码,确保没有潜在异常(如IO操作、除零、空指针等)。 - 对于需要外部资源的静态初始化,考虑使用静态方法进行延迟初始化,或捕获异常并处理。 #### 步骤4:处理`com.sun.tools.javac`相关错误 - 确保项目中不要直接依赖`com.sun.tools`包(因为它属于JDK内部API,不同版本可能不兼容)。 - 如果必须使用,确保使用与运行JDK匹配的tools.jar。在Maven中,可以这样依赖(但通常不推荐): ```xml <dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>1.8.0</version> <scope>system</scope> <systemPath>${java.home}/../lib/tools.jar</systemPath> </dependency> ``` 注意:这种方式依赖于本地JDK安装路径,且只适用于特定版本。 - 如果使用Lombok等工具,确保其版本与JDK版本兼容。升级Lombok到最新版本可能解决该问题。 #### 步骤5:清理和重建项目 - 在IDE中执行清理操作,删除所有生成的类文件和缓存。 - 重新构建项目(如Maven的`mvn clean install`)。 ### 示例:解决静态初始化错误 假设堆栈跟踪显示如下: ``` java.lang.ExceptionInInitializerError Caused by: java.lang.NullPointerException at MyClass.<clinit>(MyClass.java:10) ``` 检查`MyClass`的第10行,可能是一个静态变量初始化为`null`后进行了方法调用。修复示例: ```java public class MyClass { // 错误:可能导致NullPointerException private static String value = SomeClass.getStaticValue(); // 假如SomeClass.getStaticValue()返回null // 改为延迟初始化 private static String value; static { try { value = SomeClass.getStaticValue(); } catch (Exception e) { value = "default"; // 提供默认值 } } } ``` ### 总结 - `ExceptionInInitializerError`:关注静态初始化的异常,通过堆栈定位根本原因。 - `com.sun.tools.javac.code.TypeTags`:确保JDK一致性,避免使用内部API。 如果上述步骤仍无法解决,请提供完整的错误堆栈信息以便进一步分析。 §§相关问题§§ 1. 如何避免Java中的静态初始化错误? 2. 如何统一项目中使用的JDK版本? 3. 为什么应该避免使用JDK内部API? 4. Lombok与JDK版本不兼容会导致哪些问题? </think>### Java中`java.lang.ExceptionInInitializerError`和`com.sun.tools.javac.code.TypeTags`错误的解决方案 #### 一、`java.lang.ExceptionInInitializerError`错误 该错误表示**静态初始化块或静态变量初始化时抛出异常**。常见原因和解决方案: 1. **静态初始化代码异常** ```java public class MyClass { static { int a = 1 / 0; // 静态块中的除零错误 } } ``` **解决:** - 检查所有`static{}`代码块和静态变量初始化逻辑 - 使用`try-catch`捕获异常: ```java static { try { // 初始化代码 } catch (Exception e) { throw new RuntimeException("静态初始化失败", e); } } ``` 2. **依赖资源未就绪** - 数据库连接/配置文件未加载 **解决:** 改为延迟初始化(惰性加载) 3. **循环静态依赖** ```java class A { static final int val = B.val + 1; } // A依赖B class B { static final int val = A.val + 1; } // B依赖A ``` **解决:** 重构代码消除循环依赖 --- #### 二、`com.sun.tools.javac.code.TypeTags`错误 此错误通常与**JDK版本不兼容**或**编译器内部API滥用**有关: 1. **JDK版本冲突** - 现象:开发环境JDK版本 ≠ 运行环境JDK版本 **解决:** ```bash # 检查版本一致性 java -version javac -version ``` - Maven项目添加指定版本: ```xml <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> ``` 2. **非法访问内部API** - 避免使用`com.sun.tools`等内部包(非标准API) **解决:** ```java // 错误用法:直接调用编译器内部类 import com.sun.tools.javac.code.TypeTags; // 禁止! ``` - 替代方案:使用标准`javax.tools` API 3. **构建工具插件冲突** - Lombok/Annotation Processor版本不兼容 **解决:** ```xml <!-- Maven中升级Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <!-- 使用最新版 --> </dependency> ``` --- #### 三、通用解决流程 1. **检查堆栈轨迹** ```bash Exception in thread "main" java.lang.ExceptionInInitializerError Caused by: java.lang.ArrayIndexOutOfBoundsException: 0 # 关键原因 ``` 2. **清理构建缓存** - Maven: `mvn clean install -U` - IDEA: File → Invalidate Caches 3. **检查依赖树** ```bash mvn dependency:tree | grep 'tools.jar' ``` 4. **验证模块配置** - 模块化项目需在`module-info.java`添加: ```java requires java.compiler; ``` > **最佳实践**:静态初始化代码应保持原子性,避免复杂逻辑;始终确保编译/运行环境JDK版本一致[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值