1

我正在开发一个 Java EE 项目(下面的配置),我面临着一个似乎是常规异常的情况:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver.

我正在使用 Eclipse、嵌入式 Tomcat 7 和 Maven,即使找到了用于测试的驱动程序,Tomcat 也找不到它。

我搜索了一些答案123但建议不清楚:建议将 更改mysql-connector-javaprovided,并手动复制服务器中的依赖项(不清楚如何)。

但是我不明白为什么我应该排除部署的依赖项(范围provided)并手动添加它,这不是矛盾吗?

阅读Maven 文档后,我觉得运行环境需要依赖,因此compile范围最适合。

正如你所看到的,我正试图弄清楚这些事情,所以我宁愿有一个解释而不是一个神奇的修复。

配置:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.26</version>
</dependency>

数据库属性:

  • URL = jdbc:mysql://127.0.0.1:3306/XXX-db?zeroDateTimeBehavior=convertToNull
  • USERBD = XXX
  • PASSWORDBD = XXX
  • DRIVER = com.mysql.jdbc.Driver

属性加载:

static {
    try {

        Properties databaseProperties = new Properties();
        InputStream inputStream = DatabaseConnection.class.getClassLoader()
                .getResourceAsStream(PROPERTIES_FILE);
        if (inputStream != null) {
            databaseProperties.load(inputStream);
        } else {
            throw new FileNotFoundException(
                    "property file '" + PROPERTIES_FILE + "' not found in the classpath");
        }
        Class.forName(databaseProperties.getProperty("DRIVER"));
        USERBD = databaseProperties.getProperty("USERBD");
        PASSWORDBD = databaseProperties.getProperty("PASSWORDBD");
        URL = databaseProperties.getProperty("URL");
    } catch (ClassNotFoundException | IOException e) {
        e.printStackTrace();
    }
}
4

1 回答 1

2

Tomcat 7 JNDI 文档为您提供答案:将它们放在 Tomcat /lib 文件夹中。

Apache Tomcat 附带的 JRE 内存泄漏预防侦听器通过在 Tomcat 启动期间触发驱动程序扫描来解决此问题。这是默认启用的。这意味着只有对侦听器可见的库(例如 $CATALINA_BASE/lib 中的库)才会被扫描以查找数据库驱动程序。如果您正在考虑禁用此功能,请注意扫描将由使用 JDBC 的第一个 Web 应用程序触发,导致重新加载此 Web 应用程序和依赖此功能的其他 Web 应用程序失败。

因此,在其 WEB-INF/lib 目录中具有数据库驱动程序的 Web 应用程序不能依赖服务提供者机制,并且应该显式注册驱动程序。

于 2017-02-20T20:04:23.053 回答