为什么JUnit测试可正常创建嵌入式Derby DB,main方法调用却报错?
问题根因
你配置的org.apache.derby:derby依赖使用了<scope>test</scope>作用域,这是问题的核心诱因:
- Maven中
test作用域的依赖仅会在测试代码编译、JUnit测试运行两个阶段被加入类路径 - 主程序main方法运行属于正式运行上下文,不会加载
test作用域的依赖,因此找不到Derby核心类org.apache.derby.iapi.jdbc.JDBCBoot,触发类不存在异常。
这个特性完全匹配你遇到的「JUnit运行正常、main方法运行失败」的现象。
解决方案
根据你的使用场景二选一即可:
- 若主程序运行阶段确实需要用到嵌入式Derby,直接删除
derby依赖的<scope>test</scope>配置,默认作用域会让该依赖在编译、运行、测试全阶段生效。 - 若仅测试阶段需要用嵌入式Derby、主程序对接其他数据库,调整main方法逻辑,不要在主程序中调用Derby相关的初始化代码即可。
额外优化建议
你代码中手动注册Derby驱动的步骤是冗余的:JDBC4.0及以上版本会自动扫描classpath下META-INF/services/java.sql.Driver文件自动加载匹配的驱动,不需要手动实例化EmbeddedDriver再调用DriverManager.registerDriver()注册。
内容的提问来源于stack exchange,提问作者kyleryan1291
相关产品推荐
相关产品推荐

