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