1

我使用 JDBI 在我的计算机上本地创建了一个项目,它与数据库接口没有任何问题。

我现在在 Tomcat 服务器上使用相同的项目。我正在编译我的代码,javac -cp "lib/*" cs5530/*.java其中 lib 包含我所依赖的外部 jar,例如 jdbi-2.49.jar。

这段代码是我创建新 DBI 的地方。

public static DAO getDbConnection() {
    MysqlDataSource ds = new MysqlDataSource();
    ds.setServerName("server");
    ds.setUser("user");
    ds.setPassword("password");
    ds.setDatabaseName("dbName");
    DBI dbi = new DBI(ds);
    return dbi.onDemand(DAO.class);
}

它在我的类构造函数中调用:

public Customer() {
    this.conn = getDbConnection();
}

这是我得到的错误:

java.lang.NoClassDefFoundError: org/skife/jdbi/v2/DBI
    cs5530.Customer.getDbConnection(Customer.java:85)
    cs5530.Customer.<init>(Customer.java:31)
    org.apache.jsp._1_jsp._jspService(_1_jsp.java:105)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

那么为什么它会在看到必要的类时编译得很好,然后在运行时出现问题,我将如何解决这个问题?

谢谢。

4

1 回答 1

0

当 JVM 在其类路径中找不到匹配的类时,会发生 NoClassDefFoundError。它没有找到您的 jdbi 库。在编译时,您明确告诉 javac 在哪里可以找到该库,但在运行时 Tomcat 需要能够找到它,这意味着将它放在 Tomcat 知道要查找它的地方。

通常,Tomcat 希望在 webapps 文件夹下找到组织为单独的 Web 应用程序的 Java 代码,这样应用程序 jar 就可以放在下面

 $CATALINA_HOME/webapps/whateveryourwebappnameis/WEB-INF/lib

并且应用程序的类文件将在

 $CATALINA_HOME/webapps/whateveryourwebappnameis/WEB-INF/classes

public_html 在我看来像是一个放置 Java 类文件的奇怪地方。但是,如果您所拥有的对您有用,请将 lib 文件夹直接移动到 WEB-INF 下。

于 2014-04-02T20:17:02.757 回答