即使在设置classpath后,JDBC也无法查找类

时间:2018-01-21 23:09:35

标签: java sqlite jdbc

我在使用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的答案,所以我不相信简单地设置类路径是问题 - 除非我以某种方式设置它不正确。

0 个答案:

没有答案