java.lang.ClassNotFoundException:com.mysql.jdbc.Driver 在运行时(eclipse / maven /tomcat)[重复]
Posted
技术标签:
【中文标题】java.lang.ClassNotFoundException:com.mysql.jdbc.Driver 在运行时(eclipse / maven /tomcat)[重复]【英文标题】:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver during Runtime (eclipse / maven /tomcat) [duplicate] 【发布时间】:2011-12-27 16:57:44 【问题描述】:我在运行 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 无法找到 Class 并且是类路径配置错误,我希望 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();
【问题讨论】:
你是否也复制了Tomcat lib文件夹中的mysql连接器jar文件? 感谢您的快速响应。我没有尝试它,因为我希望 maven 能够通过将必要的 jar 复制到 WebContent/WEB-INF/lib 或它放置它们的任何位置来处理所有 jar 依赖项。我应该明确地这样做吗?我会尝试更新线程。 Tudor 和 duffymo 建议您将驱动程序复制到 tomcat 的 lib 目录 ($CATALINA_HOME/lib) 中,而不是 Web 应用程序的 lib 目录中。 是的,现在复制了它,我再也看不到异常了。我知道这是解决方案之一,但我试图弄清楚如何通过 maven 对其进行配置,以便在没有任何手动配置的情况下处理它。感谢您的帮助。 你是在使用jdni查找数据源吗? 【参考方案1】:Tomcat 7 要求 JDBC 驱动程序 JAR 必须放在其 /lib 目录中:
http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html
搜索“忘记”这个词。
【讨论】:
那么 pom.xml 中的范围呢?默认的compile scope也会打包到war中,会不会有问题? 只有当您使用 jdni 资源查找来查找数据源时才适用,这可能不是询问者的情况。如果不是,这实际上是一个糟糕的建议,应该避免,因为它会污染全局 lib 目录,其中包含仅一个 webapp 需要的库,并且在取消部署时不会被删除。 这非常关键。过去在使用其他版本的 Tomcat 时,我没有明确复制它,我忽略了这个版本(Tomcat 7.0)。我还将尝试更改 pom 中的范围,看看这是否有助于避免显式复制到 /lib 目录中。 “污染全局 /lib 目录”?如果这种污染是有害的,我怀疑编写 Tomcat 的人会做出改变。从某种意义上说,部署在单个 Tomcat 实例上的应用程序也可能共享一个数据源,这是一件好事。这种安排确保每个人都可以使用适当的驱动程序。如果不同的应用程序需要不同版本的驱动程序,这是一件坏事,但如果数据库是共享的,则通常不是这种情况。 这修复了错误。对于那些通过 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。【参考方案2】:
确保驱动程序实际上被复制到您的 webapp WEB-INF/lib 目录和 wtp 部署目录(类似于 /.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ 在您的工作区)。
我发现 maven-wtp 集成比完美更糟糕,因为我经常偶然发现这个问题。
【讨论】:
我该怎么做?通过更改mysql连接器jar的maven依赖范围还是手动复制? 我没有使用 JNDI。我更新了关于如何加载驱动程序的帖子。 我只能通过手动复制它们来做到这一点。也许有更好的解决方案。如果是这样,我很想知道。 这里也是同样的问题:maven.40175.n5.nabble.com/…。一些评论者只是在 pom.xml 中明确复制资源【参考方案3】:对于这个错误:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
你需要“导入 com.mysql.jdbc.Driver;”即使它在应用程序运行之前不使用。
【讨论】:
以上是关于java.lang.ClassNotFoundException:com.mysql.jdbc.Driver 在运行时(eclipse / maven /tomcat)[重复]的主要内容,如果未能解决你的问题,请参考以下文章