ClassNotFoundException:org.postgresql.Driver,Android的java.lang.ClassNotFoundException

25

我正在Windows上运行Eclipse。

按照这个教程的指示,我下载了JDBC4,并使用Project>Properties>add External JAR将其添加到我的构建路径中。我浏览找到文件后,它成功地工作了(.classpath文件显示了正确的库路径)。

该软件包出现在我的“Referenced Libraries”文件夹中,因此我继续进行教程。

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;

    ....

    public void open ()
        {
    try {
        Class.forName("org.postgresql.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    try {
        conn = DriverManager.getConnection(url, username, password);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

我认为这很简单,但是我遇到了一个长长的堆栈跟踪,其起点如下:

    java.lang.ClassNotFoundException: org.postgresql.Driver

(如果需要,我可以提供更多信息)

我尝试使用include org.postgresql.*;,但这也没有帮助。我还尝试了JDBC3,但那里也没有运气。

我查看了在Android中使用Driver JDBC PostgreSQL,但是它只提供了一个模糊的答案,说我最好只使用HTTP + JSON。而我从未使用过它。

我对Android、postgresql和Web开发都是全新的,所以希望得到一个简单的答案。


1
你有没有把.jar文件放在libs文件夹里而不是lib文件夹里?自从ADT r17之后,从外部位置引用的库将不会被打包到.apk中。结果是你的项目可以编译通过,但在运行时,由于缺少库,你会遇到NoClassDefFoundError错误。顺便说一下,关于这个问题在SO上有很多类似的问答,例如这个 - MH.
搞定了,还有很多要学 :P 谢谢! - user1438048
9个回答

27

根据search.maven.org所述,在您的项目中添加PostgreSQL JDBC Driver。

Gradle:

implementation 'org.postgresql:postgresql:42.2.10'

Maven

<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <version>42.2.10</version>
</dependency>

您也可以下载JAR并手动导入到项目中。

注意:本答案中所使用的编译方式已被废弃,请根据3中的实现进行替换。


1
你确定这是要使用的正确版本吗?https://mvnrepository.com/artifact/org.postgresql/postgresql - Mygod
尝试运行DriverManager.getConnection(),至少使用版本42.2.12,会导致java.lang.ClassNotFoundException: Didn't find class "java.lang.management.ManagementFactory"的错误。 - Sumit
@Sumit,有解决那个错误的方法吗?我也遇到了同样的错误。 - Anant Shah

4
你应该将jar包放入lib文件夹(WebContent-WEB-INF-lib)中,然后右键单击jar包-构建路径-添加到构建路径。

这个驱动在安卓上无法工作,java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/management/ManagementFactory; at org.postgresql.util.PGPropertyMaxResultBufferParser.adjustResultSize据我所知,目前还没有适用于PostgreSQL的安卓驱动程序。 - Warren MacEvoy
我成功加载了旧版本的驱动程序:org.postgresql:postgresql:42.2.9.jre7,较新的版本在Android 29上失败(未在其他版本的Android上测试)。 - Warren MacEvoy

0

如果以上解决方案都不适用于您的情况,那么将JDBC JAR文件下载并添加到您正在使用的工具的构建路径中可能是一个临时解决方案。


0

我的postgresql驱动程序一直运行良好,直到我在项目上进行了一些开发:添加了一些新文件,包括映射器文件,因为我使用了Spring和MyBatis。突然,在我尝试在服务器(tomcat)上运行它时,我收到了org.postgresql.Driver无法加载的错误。

我的解决方案: 重新启动Eclipse。也许在某种程度上,Eclipse与驱动程序失去了联系。因此,需要通过重新启动来刷新它。


0

这是一个CLASSPATH问题;当类加载器尝试加载它时,PostgreSQL JDBC驱动程序不可用。您需要正确地将其添加到CLASSPATH中。

如果在Eclipse中工作,则是因为将JAR添加到构建路径中实际上就是将其添加到CLASSPATH中。您必须了解如何在没有Eclipse训练轮帮助的情况下使用CLASSPATH。


0

将JDBC驱动程序jar文件添加到您的类路径中

前往https://jdbc.postgresql.org/download/

下载jar文件

右键单击Java项目 点击运行为 运行配置 点击classpath选项卡 点击您的项目名称 从右侧面板中选择添加外部jar 定位文件并单击应用 运行


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

我面临了同样的问题;但我的错误是我只在插件部分添加了postgre依赖项;在将postgre依赖项(以下)添加到项目依赖项部分后,它起作用了。

<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>    
</dependency>

版本 postgresql:postgresql:9.1-901-1.jdbc4 非常老旧。最新版本是 org.postgresql:postgresql:42.2.5,请参见 https://search.maven.org/search?q=g:org.postgresql%20AND%20a:postgresql - Mark Rotteveel

0

我为gradle尝试了无数的方法,最终只需要在build.gradle文件中添加这一行。

dependencies {
    compile group: 'org.postgresql', name: 'postgresql', version: '42.2.1'
}

-2
假设您的依赖项已正确配置(请参见评论中指出的Android SDK版本17或更高版本中的libs目录),则您应该能够通过显式地向驱动程序管理器注册它来使9.2驱动程序正常工作。
而不是:
Class.forName("org.postgresql.Driver");

使用:

DriverManager.register(new org.postgresql.Driver());

我也尝试过使用9.3-1100-jdbc41 jar,但是它无法工作。

请注意,正如Craig Ringer在回答重复问题时所解释的那样,在Android上使用JDBC通常不是一个好主意,因为JDBC连接不适合Android设备通常使用的网络使用模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接