1个回答

test
2024-07-12
因为JDBC通常你在编码的时候依赖的只是JDBC接口,而不直接依赖mysql JDBC对吧?
想想你在连接mysql的时候是不是用的类似于这样的代码?
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, username, password);
// ...
我们会发现我们会使用反射方法Class.forName
在运行的时候从ClassPath中加载Mysql JDBC,后续调用的时候均没有使用任何MySQL JDBC的专有方法,而是用的JDBC接口,对吧?
所以JDBC Driver不是编译依赖(Compile Scope),因为我们的代码中没有直接使用JDBC Driver的专有方法,所以编译的时候不需要JDBC Driver存在。JDBC接口才是编译依赖,JDBC Driver属于运行依赖(Runtime Scope)。
你声明Runtime依赖的时候在编译中是不会将依赖引入ClassPath的,但是打包的时候会,所以无需担心,JDBC Driver就应该是Runtime Scope依赖。
Compile Scope指的是编译的时候需要该依赖,通常编译依赖也是Runtime依赖,而Maven/Gradle对于compile依赖通常都是编译之后同时也包含在fat jar中的,相当于Compile就隐含Runtime。某些依赖也可能是CompileOnly依赖,比如注解处理器就是典型的CompileOnly依赖,只有编译的时候需要,编译过后在运行中是不需要的
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容