【问题标题】:java.lang.ClassNotFoundException: org.sqlite.JDBC Androidstudio Java Modulejava.lang.ClassNotFoundException: org.sqlite.JDBC Androidstudio Java 模块
【发布时间】:2018-09-11 08:24:08
【问题描述】:

我不知道(太愚蠢了),为什么我的应用在运行时找不到 jdbc 类:

Exception in thread "main" java.lang.ClassNotFoundException: org.sqlite.JDBC

你有什么提示吗?此仓库中的完整简化用例:https://bitbucket.org/solvapps/jdbcapp

我在我的 Androidstudio 项目中添加了一个名为“maintain”的模块,用于维护不应包含在应用程序中的内容。 (我已经用另一个应用程序做到了)。

我的维护等级:

apply plugin: 'java'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

sourceCompatibility = "1.8"
targetCompatibility = "1.8"

repositories {
    mavenCentral()
}


dependencies {
    compile 'org.xerial:sqlite-jdbc:3.16.1'
    compile 'commons-net:commons-net:3.3'
    compile 'org.zeroturnaround:zt-zip:1.11'
    compile 'org.zeroturnaround:zt-zip:1.11'
    compile 'org.apache.commons:commons-lang3:3.5'
}

同步后,我在外部库中看到了 jar。

我的代码,不是红色的:

 public static void connect(String language, boolean readonly) throws SQLException, ClassNotFoundException, IOException {

        // Hole DBPath
        String dbpath = Constants.getDbName(language);

        Class.forName("org.sqlite.JDBC");
        SQLiteConfig config = new SQLiteConfig();

        if (readonly){
            config.setReadOnly(true);
        }else{
            config.setReadOnly(false);
        }

        connection = DriverManager.getConnection("jdbc:sqlite:" + dbpath,config.toProperties());
    }

错误:

Exception in thread "main" java.lang.ClassNotFoundException: org.sqlite.JDBC
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at solveraapps.maintain.DbService.connect(DbService.java:24)

【问题讨论】:

  • Android 对版本 xerial sqlite-jdbc 3.16.1 的支持被明确标记为实验性的。为什么不使用最新版本?
  • 这与jdbc驱动的版本无关。从模块中识别 jar 是一个普遍的问题。
  • 您是否检查过 sqlite-jdbc 类是否包含在应用的 dex 文件中(例如,通过 Android Sudio APK Inspector)?

标签: java android android-studio gradle classnotfoundexception


【解决方案1】:
try{  
        Class.forName("com.mysql.jdbc.Driver");  
        Connection con;
        con=DriverManager.getConnection("jdbc:mysql://localhost:8080/DBName","root","root");  
        //here DBName is database name, root is username and password  
        Statement stmt=con.createStatement();  
        ResultSet rs=stmt.executeQuery("select * from Table_name");
        //Table_name is Table Name Which Must Exist IN Your Database
        while(rs.next())  
        System.out.println(rs.getInt(1)+"  "+rs.getString(2)+"  "+rs.getString(3));  
        con.close();  
    }catch(Exception e){ System.out.println(e);}  
    } 

您必须将 mysql-connector.jar 文件添加到您的库中, 您可以从Here下载文件

【讨论】:

  • 不,这不适用于 AndroidStudio。这仅适用于 Apps 域,但不适用于我需要的模块。它在 IntelliJ 中完美运行。
【解决方案2】:

org.sqlite.JDBC 属于 sqlite-jdbc jar,你需要在你的类路径中包含这个 jar。 您可以使用 gradle 从 maven 存储库下载 jar。查找 gardle 依赖

compile 'org.xerial:sqlite-jdbc:3.8.11'

【讨论】:

    【解决方案3】:

    您似乎已将库添加到项目中,但没有将此库添加到模块的依赖项中:Take Look At Here

    【讨论】:

      【解决方案4】:

      嗯,这不是完美的解决方案,但它可能会奏效。 添加:

      repositories {
      
          ...
      
          flatDir {
              dirs 'libs'
          }
      }
      

      还有:

      dependencies {
      
          ...
      
          compile files('libs/sqlite-jdbc-3.16.1.jar')
      }
      

      不要忘记将 sqlite-jdbc-3.16.1.jar 添加到

      [你的项目文件夹]\app\libs

      因为您将使用本地 jar 文件而不是导入它。如果“libs”文件夹不存在,只需创建它即可。

      这并不完全符合您的要求,但它可能会解决问题。 另请注意,“编译”将在 2018 年底被弃用。我只给你这个解决方案是因为我 100% 确定它有效。但是您应该尝试将“编译文件”替换为新术语(我认为是“实现文件”?)。

      告诉我结果如何。

      祝你好运。

      【讨论】:

      • 非常感谢您的帮助,但这似乎不是一个持久的解决方案。与此同时,我将我的项目拆分为 2 个项目(应用程序、维护)。对于维护项目,我使用 IntelliJ。
      • 它是可持续的。你只需要找到一种新的方式,Android 使用关键字“implementation”来导入本地库文件。这是一个全新的条件,所以我还没有接触到它。
      猜你喜欢
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多