因为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依赖,只有编译的时候需要,编译过后在运行中是不需要的
因为JDBC通常你在编码的时候依赖的只是JDBC接口,而不直接依赖mysql JDBC对吧?
想想你在连接mysql的时候是不是用的类似于这样的代码?
我们会发现我们会使用反射方法
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依赖,只有编译的时候需要,编译过后在运行中是不需要的