为什么mysql的依赖scope是runtime?

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

回复
阅读 684
2 个回答

因为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 , 所以编译时不需要依赖.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏