环境描述
- IntelliJ IDEA 2020.2 (Ultimate Edition)
- Oracle Java Development Kit 14.0.1
- Groovy 3.0.5 (installed via Scoop)
问题描述
当您在 IntelliJ IDEA 中创建了 Groovy 项目并尝试运行时,可能会出现与下列内容相似的报错(位于 Build 界面的 Build Output 中)。
执行预编译任务...
正在加载 Ant 配置…
Running Ant Tasks...
Too many modules require recompilation, forcing full project rebuild
Cleaning output directories...
Running 'before' tasks
Checking sources
Searching for compilable files...
Groovyc: loading sources... [Groovy-Tutorial]
Groovyc: compiling... [Groovy-Tutorial]
Groovy stub generator: initialization [Groovy-Tutorial]
Groovy stub generator: parsing [Groovy-Tutorial]
Groovy compiler in operation... [Groovy-Tutorial]
Groovyc: While compiling Groovy-Tutorial:java.lang.NoClassDefFoundError: Unable to load class org.apache.groovy.jaxb.extensions.JaxbExtensions due to missing dependency javax/xml/bind/JAXBContext
at org.codehaus.groovy.vmplugin.v8.Java8.configureClassNode(Java8.java:458)
at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:274)
at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:396)
at org.codehaus.groovy.transform.stc.AbstractExtensionMethodCache.scan(AbstractExtensionMethodCache.java:116)
at org.codehaus.groovy.transform.stc.AbstractExtensionMethodCache.getMethods(AbstractExtensionMethodCache.java:97)
at org.codehaus.groovy.transform.stc.AbstractExtensionMethodCache.getMethodsFromClassLoader(AbstractExtensionMethodCache.java:73)
at org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163)
at org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154)
at org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:115)
at org.codehaus.groovy.transform.stc.AbstractExtensionMethodCache.get(AbstractExtensionMethodCache.java:51)
at org.codehaus.groovy.macro.transform.MacroCallTransformingVisitor.findMacroMethods(MacroCallTransformingVisitor.java:119)
at org.codehaus.groovy.macro.transform.MacroCallTransformingVisitor.visitMethodCallExpression(MacroCallTransformingVisitor.java:90)
at org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:76)
at org.codehaus.groovy.ast.CodeVisitorSupport.visitExpressionStatement(CodeVisitorSupport.java:117)
at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitExpressionStatement(ClassCodeVisitorSupport.java:200)
at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:40)
at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:86)
at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:164)
at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69)
at org.codehaus.groovy.ast.MethodCallTransformation.visit(MethodCallTransformation.java:49)
at org.codehaus.groovy.transform.ASTTransformationVisitor.lambda$addPhaseOperationsForGlobalTransforms$4(ASTTransformationVisitor.java:337)
at org.codehaus.groovy.control.CompilationUnit$ISourceUnitOperation.doPhaseOperation(CompilationUnit.java:880)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:650)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:627)
at org.jetbrains.groovy.compiler.rt.GroovyCompilerWrapper.compile(GroovyCompilerWrapper.java:62)
at org.jetbrains.groovy.compiler.rt.DependentGroovycRunner.runGroovyc(DependentGroovycRunner.java:119)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.jetbrains.groovy.compiler.rt.GroovycRunner.intMain2(GroovycRunner.java:81)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.jetbrains.jps.incremental.groovy.InProcessGroovyc.runGroovycInThisProcess(InProcessGroovyc.java:167)
at org.jetbrains.jps.incremental.groovy.InProcessGroovyc.lambda$runGroovyc$0(InProcessGroovyc.java:77)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:832)
Groovyc: Internal groovyc error: code 1
Finished, saving caches...
执行后编译任务...
正在加载 Ant 配置…
Running Ant Tasks...
正在同步输出目录…
2020/8/25 17:29 - 编译完成 1 个错误 和 0 个警告 in 7 s 712 ms
异常类型为 java.lang.NoClassDefFoundError ,具体原因为:
由于缺少依赖项 javax/xml/bind/JAXBContext ,无法加载类 org.apache.groovy.jaxb.extensions.JaxbExtensions
解决方案
此问题是由于 Java 类路径(Classpath)中缺少 JAXB 依赖引起的,以下提供2种解决方式:
-
将 JDK 切换为 1.8 并尝试重新构建项目
-
将 Groovy SDK 提供的 JAXB 依赖添加至 IntelliJ IDEA 项目(推荐)
方案一 更改 JDK 版本
JDK 9 及以上版本默认不提供 JAXB 依赖,因此可以选择将 JDK 降级至 8 (1.8) 解决。
如果您本地尚未安装 JDK 1.8 ,推荐使用方案二解决,也可以通过 IntelliJ IDEA 下载并安装 JDK ;如果您已经安装了 JDK 1.8 但尚未添加至 IntelliJ IDEA ,请添加 JDK。
更改完成后,重新构建项目即可。
方案二 添加 JAXB 依赖
Groovy SDK 在安装目录的 lib/extras-jaxb 子目录下提供了额外的 JAXB 依赖项,可用于 JDK 9 及更高版本。前往 IntelliJ IDEA 项目结构的全局库列表,将 JAXB 依赖项添加至类库。
应用并确定、重新构建项目,即可成功运行 Groovy 项目!