Postgresql JDBC 驱动程序导致 NoClassDefFoundError
Posted
技术标签:
【中文标题】Postgresql JDBC 驱动程序导致 NoClassDefFoundError【英文标题】:Postgresql JDBC driver causing NoClassDefFoundError 【发布时间】:2018-12-17 23:46:42 【问题描述】:我正在尝试让我正在开发的应用程序连接到 Postgresql 服务器。我已经从官方 Postgresql JDBC 驱动程序页面下载了 postgresql-42.2.5.jre7,将 jar 放到了 libs 目录中,在类路径中添加了一行以便它可以编译。一切正常,直到我真正尝试建立连接,此时我收到此错误:
Caused by: java.lang.ClassNotFoundException: Didn't find class "java.util.Locale$Category" on path: DexPathList[[zip file "/data/app/swca.lithicdebitagetally-2/base.apk"],nativeLibraryDirectories=[/data/app/swca.lithicdebitagetally-2/lib/arm, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at org.postgresql.util.GT.<init>(GT.java:35)
at org.postgresql.util.GT.<clinit>(GT.java:21)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:292)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195)
at org.postgresql.Driver.makeConnection(Driver.java:454)
at org.postgresql.Driver.connect(Driver.java:256)
at java.sql.DriverManager.getConnection(DriverManager.java:179)
at java.sql.DriverManager.getConnection(DriverManager.java:213)
at swca.lithicdebitagetally.UploadData.doInBackground(UploadData.java:31)
at swca.lithicdebitagetally.UploadData.doInBackground(UploadData.java:14)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Suppressed: java.lang.ClassNotFoundException: java.util.Locale$Category
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 18 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
我真的很困惑为什么要拍摄这个,尽管它可能与我正在使用的驱动程序版本有关。 (看来我应该使用应该与 Java 8 兼容的 42.2.5,但每次使用时都会收到编译错误。
这是调用它的代码:
protected String doInBackground(String... params)
Connection connection = null;
String result = "success";
try
Class.forName("org.postgresql.Driver");
catch(ClassNotFoundException e)
e.printStackTrace();
result = "fail";
try
connection = DriverManager.getConnection(
"jdbc:postgresql://**.*.****.***:***/*****", "****",
"****");
catch (SQLException e)
System.out.println("Connection Failed! Check output console");
e.printStackTrace();
result = "fail";
return result;
【问题讨论】:
java.util.Locale$Category 需要 API 级别 24+。但是,即使您可以使其工作,使用从 Android 到远程服务器的 JDBC 也是一个坏主意。请改用 REST 服务。 【参考方案1】:看来您导入 JDBC 驱动程序有误。如果您使用的是 Java 8,则应下载 42.2.5 JDBC 驱动程序。
我刚刚在 Eclipse IDE 上使用 Java 8、Postgre JDBC 驱动程序 42.2.5 进行了测试,并且它工作正常。
我认为在类路径中插入一行并不是管理依赖项的最佳方式。您可以使用 maven 或任何其他依赖管理系统来执行此操作。或者在您的 IDE 项目文件夹中单击几下简单地添加到 buildpath。
【讨论】:
以上是关于Postgresql JDBC 驱动程序导致 NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL jdbc dirver 版本号从9到42原因
SQLException: 找不到适合 jdbc:postgresql 的驱动程序