NoClassDefFoundError when trying to run DaoGenerator for GreenDAO
Asked Answered
W

3

6

I have an Android Project, using Android Studio 2.3, which uses GreenDAO to generate the classes to interact with the SQLite database. The DaoGenerator project always worked before... but today I just needed to add 2 columns/properties to an Entity and whenever I try to run the generator project, I get the following error:

Exception in thread "main" java.lang.NoClassDefFoundError: org/greenrobot/greendao/generator/Schema
    at com.company.daogenerator.ProjectDaoGenerator.main(ProjectDaoGenerator.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.ClassNotFoundException: org.greenrobot.greendao.generator.Schema
    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)

I'm using GreenDAO 3.2.0 in my application's Gradle file:

compile 'org.greenrobot:greendao:3.2.0'

Also, in DaoGenerator's Gradle file:

apply plugin: 'java'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'org.greenrobot:greendao-generator:3.2.0'
}

My ProjectDaoGenerator.java file:

package com.company.daogenerator;

import org.greenrobot.greendao.generator.DaoGenerator;
import org.greenrobot.greendao.generator.Entity;
import org.greenrobot.greendao.generator.Property;
import org.greenrobot.greendao.generator.Schema;

public class ProjectDaoGenerator {
    private static Entity primaryKeyEntity;
    private static Entity itemTypeEntity;

    public static void main(String args[]) throws Exception {
        Schema schema = new Schema(1, "com.company.project.datamodel");
        schema.enableKeepSectionsByDefault();

        // Define entities
        Entity primaryKey = schema.addEntity("CDPrimaryKey");
        Entity installation = schema.addEntity("CDInstallation");

        // Z_PRIMARYKEY
        primaryKeyEntity = primaryKey;
        primaryKey.setTableName("Z_PRIMARYKEY");
        primaryKey.addLongProperty("ENT").columnName("Z_ENT").primaryKey();
        primaryKey.addIntProperty("MAX").columnName("Z_MAX");
        primaryKey.addStringProperty("NAME").columnName("Z_NAME");
        primaryKey.addIntProperty("SUPER").columnName("Z_INT");

        // CDInstallation
        installation.setTableName("ZCDINSTALLATION");
        installation.addLongProperty("packageDate").columnName("ZPACKAGEDATE");

        (...) // Other Properties

        // **** Generate Schema ****
        new DaoGenerator().generateAll(schema, "app/src/main/java");
    }
}

It's as if it couldn't find org.greenrobot.greendao.generator.Schema.

Woolard answered 16/3, 2017 at 19:17 Comment(0)
T
14

Set the build.gradle file for your generator like this (especially note the mainClassName):

enter image description here

Then click the "Gradle" tab in the right sidebar of Android Studio and select the "run" task of your daogenerator like this:

enter image description here

It's worked for me , more details check link : https://github.com/greenrobot/greenDAO/issues/619 http://greenrobot.org/greendao/documentation/generator/#Triggering_generation

Tedmann answered 9/11, 2017 at 11:4 Comment(6)
I can't work out where this second screenshot has come from - how do you get to this "Gradle" view?Stud
are you coding in Android Studio then you can easily see Gradle in right sidebar.If there is you can't see, then double click on shift button -> search box come - > just type "Gradle" -> then you can see gradle (first in list).Tedmann
After doing this for me its causing duplicate member variablesHyposthenia
@war_Hero Make sure you do not include your same objects variable twice in your daoGenerator.Tedmann
Yup, checked it instead of replacing the old member variables the new ones are getting added againHyposthenia
@jestopaul it was mismatch in configuration, it was my issue thanks for your help.Hyposthenia
H
2

Apart from what @Jesto Paul mentioned, I changed the following in the Generator class

new DaoGenerator().generateAll(schema, "./app/src/main/java"); - shows Path not exist.

to

new DaoGenerator().generateAll(schema, "../app/src/main/java");

(added double dot for the path). After doing this the generator create the tables to the folder.

Heliotropism answered 11/1, 2018 at 9:43 Comment(1)
Thank you. Adding ../ helped me.Ulani
P
1

For some reason, I ran into the same problem after updating android buildToolsVersion.

After some time of searching, i've accidentally checked "Run > Edit Configurations..." for the DaoGenerator-Application.

In the list of JRE "Android API 25 Platform" was selected. So I changed it back to the external Java running on my computer (e.g. "1.8", did it before some days ago). That solved it for me.

Edit: in this project I use GreenDAO 2.1.0

Edit 2:

https://github.com/greenrobot/greenDAO/issues/619 - http://greenrobot.org/greendao/documentation/generator/#Triggering_generation

Proem answered 13/4, 2017 at 12:34 Comment(1)
Have you tried a clean, rebuild (make module) etc? I had an extra generator module, moved that code to our app module. Sorry, don't remember if I have changed the JRE before or after that. Please have a look at this issue and team's advise: github.com/greenrobot/greenDAO/issues/619Proem

© 2022 - 2024 — McMap. All rights reserved.