我在使用JDBC库为我工作时遇到了很多麻烦。
当我的类尝试在Class.forName()
调用时加载JDBC类时,我收到“java.lang.ClassNotFoundException:org.sqlite.JDBC”错误。
public static void main(String[] args) {
try {
Class.forName("org.sqlite.JDBC"); //<--- Throws error
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
我按照JDBC page上给出的说明进行操作,该说明指出我必须确保sqlite-jdbc JAR文件位于类路径中。我这样做是通过将sqlite-jdbc文件复制到与我的应用程序编译的JAR文件相同的目录中,然后使用
调用我的应用程序java -cp .:sqlite-jdbc-3.21.0.1.jar -jar myapplication.jar
这看起来应该很简单,但它仍然会给出错误,表明它找不到类。我已经确认sqlite-jdbc-3.21.0.1.jar在“com.sqlite”包中包含类“JDBC”。
unzip -l sqlite-jdbc-3.21.0.1.jar | grep JDBC.class
2499 2017-12-07 12:10 org/sqlite/JDBC.class
我的应用程序运行的目录列表如下所示:
myapplication.jar sqlite-jdbc-3.21.0.1.jar
在我看来,由于当前目录在默认的类路径中,并且我已将sqlite-jdbc-3.21.0.1.jar
复制到与我的应用程序的jar相同的目录中,因此不应该java能够找到该类甚至如果我没有设置类路径?当我在类路径中直接调用sqlite-jdbc-3.21.0.1.jar
时,java 仍然无法找到该类似乎更奇怪。什么给了?
最后,我会理解为什么这种依赖与其他依赖不同的解释。我习惯于找到一个库,在gradle中添加一行,使用compile <dependency>
将其列为依赖项,瞧,它可以在编译时和部署时找到路径。 OTOH,我习惯开发Android(不是一个独立的应用程序,因为这是),我猜测所有系统库总是在类路径中,任何非Android依赖项都包含在我的应用程序的JAR文件中。但是为什么JDBC不包含在我的应用程序JAR中,而其他依赖项是什么?
我已经阅读并实现了this question的答案,所以我不相信简单地设置类路径是问题 - 除非我以某种方式设置它不正确。