运行时出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver(在eclipse / maven / tomcat中)

8

在运行Tomcat时,我遇到了这个错误'java.lang.ClassNotFoundException: com.mysql.jdbc.Driver'。我使用的是Eclipse(Indigo,J2EE版本)/ Maven(m2e-wtp)/ Tomcat 7.0的组合。我已经在我的Web应用程序的pom文件中包含了这个依赖项(从头开始构建)。

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

我在“问题”视图中没有收到任何编译错误,但是当我从“服务器”视图运行Tomcat服务器时,出现了这些错误。 明显表明Tomcat无法找到该类,这是一个classpath配置错误,我希望maven会处理这个问题。
我查看了其他与“java.lang.ClassNotFoundException:com.mysql.jdbc.Driver”相关的问题,但并没有太大的帮助。
我将非常感谢任何帮助。
/** 这是我加载驱动程序的方式 */
static {
        DriverAdapterCPDS cpds_Customer = new DriverAdapterCPDS();
        try {                        cpds_Customer.setDriver(productConfig.getProperty("dbcp.connection.customer.driver_class"));

        } catch (ClassNotFoundException e) {
            // log.error("setDriver Exception " + e);
            e.printStackTrace();
        }
               }

1
你是否也将mysql连接器jar文件复制到Tomcat lib文件夹中了? - Tudor
感谢您的快速回复。我没有尝试过,因为我希望Maven通过将必要的jar复制到WebContent/WEB-INF/lib或其他位置来处理所有的jar依赖项。我需要明确地这样做吗?我会尝试并更新该线程。 - user977505
Tudor和duffymo建议您将驱动程序复制到Tomcat的lib目录($CATALINA_HOME/lib),而不是Web应用程序lib目录中。 - stivlo
是的,现在已经复制了它,我不再看到异常了。我知道这是其中一种解决方案,但我一直在尝试弄清楚如何通过Maven进行配置,以便无需任何手动配置就可以处理它。感谢您的帮助。 - user977505
你是否正在使用JDNI查找数据源? - soulcheck
3个回答

19

那么pom.xml中的范围怎么样呢?默认的编译范围也会将其打包到war中,这会有问题吗? - stivlo
那非常关键。在处理其他版本的Tomcat时,我没有明确地复制它,并且在这个版本(Tomcat 7.0)中忽略了它。我还将尝试更改pom中的范围,看看是否有助于避免明确复制到/lib目录中。 - user977505
在pom.xml中更改范围并没有帮助。我将mysql连接器jar的范围更改为<scope>runtime</scope>,但仍然看到ClassNotFound异常。 - user977505
不,你仍然可以将JDBC驱动程序JAR放在Tomcat 6.x的本地WEB-INF / lib中。这在版本7中发生了变化。而且Tomcat不同意你的说法。为什么这是个坏主意?我看不出有什么害处。 - duffymo
1
这样就可以解决错误了。对于那些通过Eclipse的Dynamic Web Project进行操作并不知道$CATALINA_HOME值的人,可以使用find命令查找catalina.sh(对我来说是/Library/Tomcat/apache-tomcat-8.0.28/bin/catalina.sh),然后将该脚本作为catalina.sh version调用,在输出中您将看到$CATALINA_HOME的值。在该目录下的lib文件夹中,复制mysql jar文件。 - SexyBeast
显示剩余6条评论

3

请确保驱动程序实际被复制到您的Web应用程序WEB-INF/lib目录和wtp部署目录(类似于您的工作区中的/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/)。

我发现maven-wtp集成不够完美,经常遇到这个问题。


我应该怎么做?通过改变 Maven 依赖的范围以获取 MySQL 连接器 jar 文件,还是手动复制它? - user977505
我没有使用JNDI。我已经更新了我的帖子,说明我如何加载驱动程序。 - user977505
我只能通过手动复制来完成它。也许有更好的解决方案。如果有的话,我很想知道。 - soulcheck
这里有同样的问题:http://maven.40175.n5.nabble.com/wtp-projects-dependencies-don-t-show-up-in-embedded-tomcat-WEB-INF-lib-directory-td139868.html。一些评论者只是在pom.xml中显式地复制资源。 - soulcheck

-1

针对这个错误:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

即使在应用程序运行之前未使用,您也需要“导入com.mysql.jdbc.Driver;”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接