如何在基于Servlet的项目中安装JDBC驱动程序,而不会遇到java.lang.ClassNotFoundException异常。

25

有一个非常相似的问题,但在我的情况下,我的构建路径中没有任何重复的jar文件,所以解决方案对我无效。我已经在谷歌上搜索了几个小时,但我找到的解决方案都不能解决我的问题。我正在为一个作业创建一个带有一些数据库连接的网站。我正在使用MySQL数据库,在Eclipse中开发,并在Windows上运行。

我在以下代码中一直收到java.lang.ClassNotFoundException: com.mysql.jdbc.Driver的错误:

import java.sql.*;
//...
public void someMethodInMyServlet(PrintWriter out)
{
    Connection connection = null;
    PreparedStatement query = null;
    try {

        out.println("Create the driver instance.<br>");
        Class.forName("com.mysql.jdbc.Driver").newInstance();

        out.println("Get the connection.<br>");
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
        query = connection.prepareStatement( "SELECT * FROM customers");

        //...
    } catch (Exception e)
    {
        out.println(e.toString()+"<br>");
    }
}
//...

当我运行上面的代码时,我得到以下输出:
Create the driver instance.
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

它无法通过Class.forName...这一行,并且我无法弄清楚为什么!以下是我所做的:

  1. 下载mysql-connector。
  2. 将其放入我的MySQL文件夹C:\Program Files\MySQL\mysql-connector-java-5.1.12\mysql-connector-java-5.1.12-bin.jar
  3. 在Eclipse中打开项目属性。
  4. 将外部Jar添加到我的构建路径,并选择mysql-connector-java-5.1.12-bin.jar

每次我尝试使用servlet时,无论我是否将jar文件放在那里,都会出现相同的错误。你能帮我找出问题所在吗?


非servlet测试程序在命令行上会发生什么? java -cp C:\Program Files\MySQL\mysql-connector-java-5.1.12-bin.jar;... - trashgod
@trashgod,我刚刚创建了一个空的Main类的虚拟测试项目:..\Test\src>java -cp "C:\Program Files\MySQL\mysql-connector-java-5.1.12\mysql-connector-java-5.1.12-bin.jar"; Main.java Exception in thread "main" java.lang.NoClassDefFoundError: Main/java - Kiril
13个回答

58
关于每个以JAR文件形式提供的第三方库,只需将物理JAR文件复制/粘贴到webapp的/WEB-INF/lib目录中。它将自动在webapp的默认类路径中可用。此外,Eclipse足够智能,能够自动识别。无需烦恼于构建路径。但是,请确保删除之前添加的所有不必要的引用,否则可能会发生冲突。
如果您使用Maven作为依赖管理工具,只需在项目的pom.xml文件中将所需的JDBC驱动JAR文件的Maven坐标添加为新的。它最终会自动出现在webapp的/WEB-INF/lib目录中。如果您使用的是MySQL JDBC驱动程序,您可以在这里找到坐标here
另一种选择是将其安装在服务器本身,只需将物理JAR文件放入服务器自己的/lib目录中。当您使用服务器提供的JDBC连接池数据源,并且该数据源需要MySQL JDBC驱动程序时,这是必需的。请参阅以下链接。
另请参阅:
  • 如何在WAR项目中添加JAR库而不会遇到java.lang.ClassNotFoundException错误?类路径 vs 构建路径 vs /WEB-INF/lib
  • 在基于servlet的应用程序中,我应该如何连接到JDBC数据库/数据源?
  • 我必须将JDBC驱动程序放在Tomcat连接池的哪个位置?
  • JDBC类路径不起作用

谢谢。我有同样的问题,你的解决方案很有效。但是,在webapp的'/WEB-INF/lib'中添加JAR文件和在buildpath中添加相同的JAR文件有何区别?如果每个第三方库都应该添加到'/WEB-INF/lib'中,那么为什么buildpath有添加外部JAR文件的选项呢? - whitehat
4
@Hiral: 项目的“构建路径”中的这个部分是用于编译时的类路径。如果希望JAR包在运行时也出现在类路径中,还需将其添加到项目的“部署程序集”列表中。请注意,当WAR被构建或导出时,它最终会变成/WEB-INF/lib中的JAR包。那么为什么不一开始就放置好呢? - BalusC
1
非常感谢您,我之前无法理解为什么同样的代码在Java应用程序中可以工作,但在Servlet中却不能。您的答案非常有效 :) - jaja
4
如果您是Eclipse新手,可以通过在“属性”>“部署程序集”>“添加...”>“Java构建路径条目”中选择您的jar文件来将其添加到您的项目的部署程序集中。 :) - ban-geoengineering

4
其他人说得对,需要将驱动程序JAR文件提供给您的servlet容器。我的评论意味着建议您从命令行验证驱动程序本身是否完整。
不要使用空的main(),而是尝试使用以下代码,根据包含的文档进行调整:
public class LoadDriver {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
    }
}

我会这样在我的平台上操作:

$ ls mysql-connector-java-5.1.12-bin.jar 
mysql-connector-java-5.1.12-bin.jar
$ javac LoadDriver.java 
$ java -cp mysql-connector-java-5.1.12-bin.jar:. LoadDriver

在你的平台上,你需要使用 ; 作为路径分隔符,如此处所述:这里这里


4

由于您正在servlet中运行它,因此您需要使servlet容器可以访问该jar文件。您可以将连接器作为应用程序war的一部分包含在其中,或者将其放置在servlet容器的扩展库和数据源管理内容中(如果有)。第二部分完全取决于您所使用的容器。


我正在通过Eclipse运行Tomcat服务器... 鉴于这些信息,你能更具体一些吗?我应该把jar文件放在哪里? - Kiril
2
将mysql-connector-java-5.1.6-bin.jar文件放置到\Apache Tomcat 6.0.18\lib文件夹中。 - Satya

3

请将mysql-connector-java-5.1.6-bin.jar文件放置在\Apache Tomcat 6.0.18\lib文件夹中,您的问题将会得到解决。


只有当操作者使用容器管理的“数据源”时,才能使用此方法,而不能手动操纵“DriverManager”。对于这种情况,在Web应用程序的“/ WEB-INF / lib”中放置JAR就足够了。 - BalusC
我尝试了所有其他更优雅的方法,但都失败了。暴力破解——将其放入lib中——起作用了。谢谢。 - JRun

2

不应该做的事情(特别是在共享项目上工作时)

好吧,经过同样的问题和阅读一些答案后,似乎将外部库放入WEB-INF / lib并不是一个好主意,因为它会污染Web应用程序/JRE库与特定于服务器的库 - 有关更多信息请查看此答案

另一个解决方案是将其复制到tomcat/lib文件夹中。尽管这可能有效,但难以管理共享(例如git)项目的依赖关系。

好的解决方案1

创建vendor文件夹。将所有外部库放在那里。然后将此文件夹映射为项目的依赖项。在eclipse中,您需要执行以下操作:

  1. 将您的文件夹添加到构建路径
    1. 项目属性 -> Java构建路径
    2. -> 添加外部库或任何其他解决方案以添加您的文件/文件夹
  2. 将您的构建路径添加到部署程序集中(参考
    1. 项目属性 -> 部署程序集
    2. 添加 -> Java构建路径条目
    3. 现在,您应该看到要包括在完成的WAR中的构建路径上的库列表。
    4. 选择您想要的并单击“完成”。

好的解决方案2

使用maven(或任何替代品)来管理项目依赖关系


1

只需按照以下步骤操作:

1)安装Eclipse
2)将Apache导入Eclipse
3)安装MySQL
4)下载MySQL Connector/J
5)解压缩文件并浏览,直到找到其中的bin文件。然后将包含bin的文件夹中的所有文件放置在C:\Program Files\mysql\mysql server5.1/中,同时在Eclipse中定义驱动程序时给出相同的路径地址。

这些都非常简单。


0

假设您的项目是基于Maven构建的,请将其添加到POM文件中:

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

保存 > 构建 > 然后再次测试连接。它可以工作!您实际使用的 MySQL Java 连接器版本可能会有所不同。


0

如果问题仍然存在,

将mysql-connector-java-5.0.8-bin jar文件放置在Tomcat->lib->文件夹内的任何位置(无论您安装Tomcat的位置在哪里)。并更改您的环境变量(通过单击“我的电脑”属性 -高级系统设置-环境变量-并设置新的变量名称和变量值为您的lib文件所在位置。不要忘记在路径末尾输入;)

如果问题仍然存在,请尝试下载commons-collections-2.0.jar(http://www.docjar.com/jar_detail/commons-collections-2.0.jar.html),并将该jar粘贴到与mysql jar相同的位置(即)Tomcat-lib内。

清理您的项目-停止服务器-最后尝试运行。


0
将mysql-connector-java-5.1.38-bin.jar放置于C:\Program Files\Apache Software Foundation\Tomcat 7.0\lib文件夹中,这样程序就可以执行了。

0
很多次我都遇到了这个问题,我经历过ClassNotFoundException。 如果jar文件不在物理位置上。
所以请确保.jar文件(mysql连接器)在WEB-INF lib文件夹的物理位置上。 并且请确保使用cmd中的关闭命令重新启动Tomcat。 它应该可以工作。

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