为什么mysql的依赖scope是runtime?

如题,runtime意味着打包时不包含mysql依赖,没有mysql驱动发布后的项目如何正常连接数据库呢?


回答:

因为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依赖,只有编译的时候需要,编译过后在运行中是不需要的


回答:

因为你的代码里没有 引用 com.mysql.**的相关类.

现在java中可以通过spi自动注册 Driver , 所以编译时不需要依赖.

以上是 为什么mysql的依赖scope是runtime? 的全部内容, 来源链接: utcz.com/p/944934.html

回到顶部