【问题标题】:PostgreSQL (weird): NoClassDefFoundError: com/mysql/jdbc/StringUtilsPostgreSQL(奇怪):NoClassDefFoundError:com/mysql/jdbc/StringUtils
【发布时间】:2013-01-03 21:16:34
【问题描述】:

我得到了众所周知的 NoClassDefFoundError: com/mysql/jdbc/StringUtils,但我的情况略有不同:我根本没有使用 MySQL。

我正在使用 JDK 1.6 处理 PostgreSQL 9.1 数据库。 在我的计算机上,一切正常(已加载 PostgreSQL 驱动程序,没有类路径问题等),但我必须将我的项目上传到我大学的服务器,在那里我收到以下错误:

java.lang.NoClassDefFoundError: Could not initialize class com.mysql.jdbc.StringUtils

这是完整的堆栈跟踪:

com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:286)
java.sql.DriverManager.getConnection(DriverManager.java:582)
java.sql.DriverManager.getConnection(DriverManager.java:185)
elections.ConnectionManager.getConnection(ConnectionManager.java:29)
elections.daos.LoginDAO.login(LoginDAO.java:23) 
elections.controllers.LoginController.doPost(LoginController.java:46) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
sun.reflect.GeneratedMethodAccessor35.invoke(Unknown Source) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
java.lang.reflect.Method.invoke(Method.java:597) 
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:274) 
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:271) 
java.security.AccessController.doPrivileged(Native Method) 
javax.security.auth.Subject.doAsPrivileged(Subject.java:517) 
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:306) 
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:166)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:299) 
org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:57) 
org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:193) 
org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:189) 
java.security.AccessController.doPrivileged(Native Method) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:208) 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:197) 
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1770) 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
java.lang.Thread.run(Thread.java:662)

这是我提供连接的类(这是我的第一个 JDBC 项目;我知道下面的代码不是线程安全的;我将使用连接池重写它,但首先我需要让它工作......)

static Connection conn;

public static Connection getConnection() throws Exception {
    try {

        String url = "jdbc:postgresql://host/database";
        String username = "username";
        String pwd = "password";

        Class.forName("org.postgresql.Driver");

        try {
            conn = DriverManager.getConnection(url, username, pwd);
        } catch (SQLException e) {
            e.printStackTrace();
            throw e;
        }
    } catch (ClassNotFoundException e) {
        throw e;
    }
    return conn;
}

我在互联网上进行了大量搜索,但我似乎是世界上唯一一个遇到这种问题的人......其他人只有 MySQL 有这个问题。

我什至尝试将 MySQL 驱动程序(包含缺少的 com.mysql.jdbc.StringUtils 类)放入 WEB-INF/lib 文件夹,但这没有帮助。

我发现的唯一有用信息是错误可能隐藏在其他地方(这意味着无法加载 com.mysql.jdbc.StringUtils 依赖的某些类),但我不知道在哪里搜索。

我真的不明白为什么要搜索 MySQL 类,而我只使用 PostgreSQL。

任何形式的帮助将不胜感激! :)

【问题讨论】:

  • 您之前检查过您的大学服务器上没有安装同名的应用程序吗?尝试清理工作目录(如果是 tomcat 服务器),然后尝试重新启动。
  • 我无法清理工作目录,因为我无权访问 Tomcat 文件夹。我唯一能做的就是上传 Tomcat 使用 AutoDeploy 部署的 .WAR 文件。我无法检查,但我怀疑其他人在那里安装了任何东西,因为它需要管理员权限。要安装我的应用程序,我必须要求管理员进行特殊设置,默认情况下这是不可能的。
  • 在您的情况下,询问您所在大学的服务器管理员会更有建设性。如果您说在本地计算机上运行您的应用程序没有问题,那么很明显问题出在您的大学服务器上。
  • 这就是我明天要做的事情:)我只是想,也许这是我可以自己解决的问题。

标签: java postgresql tomcat noclassdeffounderror


【解决方案1】:

JDBC 4.0 自动发现可以自动扫描和加载 JDBC 驱动程序,我猜 DriverManager 也会扫描和加载 MySQL JDBC 驱动程序,即使它从未被您的程序使用。

那么我们可以猜测您的服务器为流行的数据库供应商保留了许多 jdbc 驱动程序。您可以在本地使用mysql进行测试以找出MySQL驱动程序无法工作的原因,然后您可以告诉服务器管理员更新mysql的驱动程序或设置。

http://www.techfaq360.com/tutorial/jdbc/jdbc3_jdbc4.jsp

【讨论】:

  • 哇,太好了! :) 这几乎解释了为什么我得到与 MySQL 相关的错误。我要深入研究。
  • Link 说它应该在不调用 Class.forName 的情况下工作,但事实并非如此。我的驱动程序是 JBDC4,请仔细检查。
  • 你使用JDK 6+吗?只有 JDBC 4.0 的 DriverManager 知道文件中提到的 /META-INF/services/java.sql.Driver 和加载类的存在。
【解决方案2】:

通常,JDBC 驱动程序放置在 Tomcat SHARED 库中。因此,可能是您部署的 tomcat 有一些库,这些库会干扰您的项目。

在项目的 WEB-INF/lib 中添加缺少的库无法解决问题,因为如果导致您遇到问题的代码正在尝试使用另一个类加载器中缺少的类,它可能无法看到您尝试提供的内容来自您的应用“范围”。

因此,由于我假设您无权访问服务器的共享库,因此您应该在 sys.管理员。

【讨论】:

    【解决方案3】:

    好的,原来是 Tomcat 安全管理器的权限问题。一旦管理员检查确切原因是什么,我将在此处发布并接受最佳答案。

    【讨论】:

      猜你喜欢
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2012-02-02
      • 2016-03-24
      • 1970-01-01
      相关资源
      最近更新 更多