升级Java7至Java11的sbt 0.13.18项目出现java.sql.Driver类找不到异常
问题分析
错误提示找不到java.sql.Driver,但代码中实际执行的是Class.forName("org.h2.Driver"),核心原因是Java 9+模块化系统的变化:
- Java 7中
java.sql相关类属于核心类库,默认全局可见;但Java 9开始采用模块化设计,java.sql模块不再被默认自动加载。 - H2驱动类
org.h2.Driver实现了java.sql.Driver接口,加载H2驱动时JVM需要找到这个接口类,因此抛出ClassNotFoundException。 - 同时需要确认H2驱动版本是否适配Java 11,以及sbt 0.13.18对Java 11的兼容性配置。
解决方案
1. 显式引入java.sql模块
在项目的build.sbt中添加JVM参数,强制加载java.sql模块并开放访问权限:
javaOptions ++= Seq( "--add-modules", "java.sql", "--add-exports", "java.sql/java.sql=ALL-UNNAMED" )
或者启动项目时直接指定参数:
sbt -J--add-modules=java.sql -J--add-exports=java.sql/java.sql=ALL-UNNAMED run
2. 升级H2驱动到Java 11兼容版本
旧版H2驱动未适配Java 9+模块化,建议升级到1.4.200及以上版本(该版本完全支持Java 11):
libraryDependencies += "com.h2database" % "h2" % "1.4.200" % Runtime
3. 适配sbt 0.13.18的Java 11支持
sbt 0.13.18对Java 11的支持有限,可通过sbtopts文件全局配置JVM参数:
在项目根目录创建或修改sbtopts文件,添加:
-J--add-modules=java.sql -J--add-exports=java.sql/java.sql=ALL-UNNAMED
如果条件允许,建议升级sbt到1.x版本(如1.5.x),对Java 11的支持更完善。
4. 移除不必要的Class.forName调用(可选)
从Java 6开始,JDBC支持通过SPI自动加载驱动,无需显式调用Class.forName("org.h2.Driver")。移除该行代码后,JVM会自动从类路径中识别并加载H2驱动。
验证操作
- 执行
sbt clean compile确保编译无报错 - 执行
sbt run启动项目,检查错误是否消除 - 若仍有问题,执行
sbt show runtime:dependencyClasspath确认H2驱动已在运行时类路径中
内容的提问来源于stack exchange,提问作者davedscl
相关产品推荐
相关产品推荐

