尝试为 GreenDAO 运行 DaoGenerator 时出现 NoClassDefFoundError

Posted

技术标签:

【中文标题】尝试为 GreenDAO 运行 DaoGenerator 时出现 NoClassDefFoundError【英文标题】:NoClassDefFoundError when trying to run DaoGenerator for GreenDAO 【发布时间】:2017-08-08 03:44:26 【问题描述】:

我有一个使用 android Studio 2.3 的 Android 项目,它使用 GreenDAO 生成与 SQLite 数据库交互的类。 DaoGenerator 项目以前一直可以工作......但今天我只需要向实体添加 2 列/属性,每当我尝试运行生成器项目时,都会收到以下错误:

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)

我在我的应用程序的 Gradle 文件中使用 GreenDAO 3.2.0:

compile 'org.greenrobot:greendao:3.2.0'

另外,在 DaoGenerator 的 Gradle 文件中:

apply plugin: 'java'

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

我的 ProjectDaoGenerator.java 文件:

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

好像找不到org.greenrobot.greendao.generator.Schema

【问题讨论】:

【参考方案1】:

由于某种原因,我在更新 android buildToolsVersion 后遇到了同样的问题。

经过一段时间的搜索,我不小心选中了 DaoGenerator-Application 的 “运行 > 编辑配置...”

在 JRE 列表中选择了“Android API 25 Platform”。所以我把它改回了我电脑上运行的外部Java(例如“1.8”,几天前就做了)。这为我解决了。

编辑:在这个项目中我使用 GreenDAO 2.1.0

编辑2:

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

【讨论】:

您是否尝试过干净、重建(制作模块)等?我有一个额外的生成器模块,将该代码移至我们的应用程序模块。抱歉,不记得我是在此之前还是之后更改了 JRE。请查看此问题和团队的建议:github.com/greenrobot/greenDAO/issues/619【参考方案2】:

像这样为您的生成器设置build.gradle 文件(特别注意mainClassName):

然后点击Android Studio右侧边栏中的“Gradle”选项卡,选择你的daogenerator的“运行”任务,如下所示:

它对我有用,更多详细信息请查看链接:https://github.com/greenrobot/greenDAO/issues/619 http://greenrobot.org/greendao/documentation/generator/#Triggering_generation

【讨论】:

我无法确定第二张截图的来源 - 你如何进入这个“Gradle”视图? 你是在Android Studio中编码然后你可以很容易地在右侧边栏中看到Gradle。如果你看不到,然后双击shift按钮->搜索框出现->只需输入“Gradle " -> 然后你可以看到 gradle(列表中的第一个)。 为我执行此操作后,它会导致重复的成员变量 @war_Hero 确保没有在 daoGenerator 中包含两次相同的 objects 变量。 是的,检查它而不是替换旧的成员变量,新的成员变量又被添加了【参考方案3】:

除了@Jesto Paul 提到的之外,我在 Generator 类中更改了以下内容

new DaoGenerator().generateAll(schema, "./app/src/main/java"); - 显示路径 不存在。

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

(为路径添加了双点)。完成此操作后,生成器会在文件夹中创建表。

【讨论】:

谢谢。添加 ../ 帮助了我。

以上是关于尝试为 GreenDAO 运行 DaoGenerator 时出现 NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

GreenDao源码分析

使用 greenDao 时出现 NoClassDefFoundError

Android - 使用 GreenDao ORM 更改观察者数据库

有greenDAO线程安全最佳实践吗?

android_orm框架之greenDAO

Android之Fatal Exception: org.greenrobot.greendao.DaoException: Could not init DAOConfig