简体   繁体   中英

java.lang.ClassNotFoundException: org.sqlite.JDBC Androidstudio Java Module

I have no clue (too stupid), why my app doesn't find the jdbc class at runtime:

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

Do you have any hint ? Complete Simplified usecase in this repo : https://bitbucket.org/solvapps/jdbcapp

I have added a module called "maintain" to my Androidstudio project for maintaining stuff, which should not be included in the app. (I have done this already with another app).

在此输入图像描述

My maintain gradle :

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'
}

After sync I see the jar in External Libraries.

在此输入图像描述

My code, which is not red :

 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());
    }

Error:

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)
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);}  
    } 

You Must Add mysql-connector.jar File to Your Libraries, You can Download File From Here

org.sqlite.JDBC belongs to sqlite-jdbc jar, you need to include this jar in your classpath. You can use gradle to download jar from maven repository. Find the gardle depedency

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

看起来您已将库添加到项目中,但未将此库添加到模块的依赖项中: 看看这里

Well, it's not the perfect solution but it might work. Add:

repositories {

    ...

    flatDir {
        dirs 'libs'
    }
}

And:

dependencies {

    ...

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

Don't forget to add sqlite-jdbc-3.16.1.jar into

[your project's folder]\\app\\libs

as you will be using a local jar file instead of importing it. Just create the "libs" folder if it doesn't exist.

It's not exactly what you're asking for, but it might solve the problem. Also note that "compile" is getting deprecated by the end of 2018. I only gave you this solution because I'm 100% sure it works. But you should try to replace that "compile files" for the new term ("implementation files", I think?).

Let me know how it works out.

Good luck.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM