Java9环境IntelliJ中Groovy+openCSV缺失ResultSet依赖求助
问题:Java 9 + Groovy 2.4 + OpenCSV 4.0在IntelliJ编译报错,提示缺失java/sql/ResultSet
我在Java 9环境中使用Groovy 2.4搭配OpenCSV 4.0开发程序,通过Gradle的runApp任务运行时一切正常,但在IntelliJ IDEA中运行/编译时,编译器抛出错误,提示因缺失java/sql/ResultSet依赖,无法加载com.opencsv.CSVWriter类。
相关配置
Gradle依赖与任务配置
// https://mvnrepository.com/artifact/com.opencsv/opencsv compile group: 'com.opencsv', name: 'opencsv', version: '4.0' task runApp(type: JavaExec) { classpath = sourceSets.main.runtimeClasspath main = 'mongo.UserReport' }
堆栈跟踪
Error:Groovyc: While compiling Tools_main: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Unable to load class com.opencsv.CSVWriter due to missing dependency java/sql/ResultSet at org.codehaus.groovy.control.CompilationUnit.convertUncaughtExceptionToCompilationError(CompilationUnit.java:1101) at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1079) at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603) at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581) at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558) at org.jetbrains.groovy.compiler.rt.GroovyCompilerWrapper.compile(GroovyCompilerWrapper.java:62) at org.jetbrains.groovy.compiler.rt.DependentGroovycRunner.runGroovyc(DependentGroovycRunner.java:115) 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:136) 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:158) at org.jetbrains.jps.incremental.groovy.InProcessGroovyc.lambda$runGroovyc$0(InProcessGroovyc.java:88) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.base/java.lang.Thread.run(Thread.java:844) Caused by: java.lang.NoClassDefFoundError: Unable to load class com.opencsv.CSVWriter due to missing dependency java/sql/ResultSet at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:397) at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:280) at org.codehaus.groovy.ast.ClassNode.getUnresolvedSuperClass(ClassNode.java:1009) at org.codehaus.groovy.ast.ClassNode.getUnresolvedSuperClass(ClassNode.java:1004) at org.codehaus.groovy.ast.ClassNode.getSuperClass(ClassNode.java:998) at org.codehaus.groovy.ast.ClassNode.isDerivedFrom(ClassNode.java:941) at org.codehaus.groovy.classgen.asm.InvocationWriter.castToNonPrimitiveIfNecessary(InvocationWriter.java:863) at org.codehaus.groovy.classgen.asm.OperandStack.doConvertAndCast(OperandStack.java:345) at org.codehaus.groovy.classgen.asm.OperandStack.doGroovyCast(OperandStack.java:282) at org.codehaus.groovy.classgen.asm.BinaryExpressionHelper.evaluateEqual(BinaryExpressionHelper.java:344) at org.codehaus.groovy.classgen.AsmClassGenerator.visitDeclarationExpression(AsmClassGenerator.java:664) at org.codehaus.groovy.ast.expr.DeclarationExpression.visit(DeclarationExpression.java:89) at org.codehaus.groovy.classgen.asm.StatementWriter.writeExpressionStatement(StatementWriter.java:613) at org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.writeExpressionStatement(OptimizingStatementWriter.java:366) at org.codehaus.groovy.classgen.AsmClassGenerator.visitExpressionStatement(AsmClassGenerator.java:651) at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42) at org.codehaus.groovy.classgen.asm.StatementWriter.writeBlockStatement(StatementWriter.java:85) at org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.writeBlockStatement(OptimizingStatementWriter.java:159) at org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:597) at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:104) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:115) at org.codehaus.groovy.classgen.AsmClassGenerator.visitStdMethod(AsmClassGenerator.java:461) at org.codehaus.groovy.classgen.AsmClassGenerator.visitConstructorOrMethod(AsmClassGenerator.java:414) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:126) at org.codehaus.groovy.classgen.AsmClassGenerator.visitMethod(AsmClassGenerator.java:538) at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1081) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:53) at org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:260) at org.codehaus.groovy.control.CompilationUnit$17.call(CompilationUnit.java:825) at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1065)
回答
这个问题我之前碰到过,本质是Java 9的**模块化系统(JPMS)**和Groovy 2.4编译器在IntelliJ环境下的兼容性问题:Java 9开始,java.sql模块不再默认被自动引入,而Groovy 2.4的编译器在IntelliJ里没有自动处理这个依赖,导致编译时找不到java.sql.ResultSet——而OpenCSV 4.0的CSVWriter刚好依赖这个类。至于Gradle任务能正常运行,是因为JavaExec用的是传统类路径模式,不会受模块化的严格限制,和IDE的编译逻辑不一样。
下面给你两种靠谱的解决方法:
方法一:通过Gradle全局配置解决
修改你的Gradle构建脚本,给Groovy编译任务添加--add-modules java.sql参数,强制编译器引入该模块:
compileGroovy { options.compilerArgs += ['--add-modules', 'java.sql'] } // 如果有测试代码,也要同步配置 compileTestGroovy { options.compilerArgs += ['--add-modules', 'java.sql'] }
配置完成后,执行gradle clean build,然后回到IntelliJ点击Gradle工具栏的刷新按钮同步项目,重新编译就没问题了。
方法二:直接在IntelliJ中配置编译器参数
如果你不想修改Gradle脚本,也可以直接在IDE里设置:
- 打开
File > Settings > Build, Execution, Deployment > Compiler > Groovy Compiler(Mac用户是IntelliJ IDEA > Settings) - 在
Additional command line parameters输入框中填入:--add-modules java.sql - 点击
Apply和OK,然后重启编译即可
内容的提问来源于stack exchange,提问作者sfgroups
相关产品推荐
相关产品推荐

