我使用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)


那么,为什么在看到必要的类后就可以正常编译,然后在运行时崩溃呢?我该如何解决呢?

谢谢。

最佳答案

当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的正下方。

关于java - java.lang.NoClassDefFoundError:org/skife/jdbi/v2/DBI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22816328/

10-11 10:39