JDBC4驱动程序包含一个文件:
meta-INF/services/java.sql.Driver
在使用ServiceProvider机制向JVM注册Driver实现的jar中(请参阅javadocs以获取java.util.ServiceLoader)。这就是为什么
Class.forName不再需要。
我的猜测是这是一个类加载器问题。在
ServiceLoaderjavadoc中提到:
该提供程序必须可以从最初查询以查找配置文件的同一类加载程序进行访问;请注意,这不一定是实际从中加载文件的类加载器。
我会尝试将驱动程序放在
tomcatlib目录而不是Web应用程序目录中,以查看是否有所不同(不同的类加载器?)。
如果通过ide启动Web应用程序并设置断点,则一旦达到断点,就可以使用“求值表达式”功能执行:
ServiceLoader.load(Driver.class)。这将为您提供一
ServiceLoader堂课,您可以查看一下已注册的驱动程序。您可以检查mysql驱动程序是否存在,在列表中的位置等等,这可能有助于在此处弄清楚行为。



