Android的工作室 - java.lang.NoClassDefFoundError的 [英] Android Studio - java.lang.NoClassDefFoundError

查看:259
本文介绍了Android的工作室 - java.lang.NoClassDefFoundError的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我添加了的.jar 文件到 LIB 文件夹中的项目目录:

接下来我右点击每一个.jar文件,并选择添加为库。

然后我说的依赖到的build.gradle文件:

 应用插件:'com.android.application    安卓{
        compileSdkVersion 21
        buildToolsVersion21.1.2        defaultConfig {
            的applicationIDcom.ryzomarmory.crm.ryzomarmory
            16的minSdkVersion
            targetSdkVersion 21
            版本code 1
            的versionName1.0
        }
        buildTypes {
            发布 {
                minifyEnabled假
                proguardFiles getDefaultProguardFile('proguard的-android.txt'),'proguard-rules.pro
            }
        }
    }    依赖{
        编译文件树(导演:'库',包括:['的* .jar'])
        编译com.android.support:appcompat-v7:21.0.3
        编译文件(公地DBCP-1.4.jar')
        编译文件(公共池-1.6.jar')
        编译文件(使用mysql-connector-java的5.1.30-bin.jar')
    }

当我试图运行Android应用程序将显示 java.lang.NoClassDefFoundError的。以下是完整的日志:

  11月2日至二十六日:13:54.671 20960-20960 / com.ryzomarmory.crm.ryzomarmory E / AndroidRuntime:致命异常:主要
    工艺:com.ryzomarmory.crm.ryzomarmory,PID:20960
    java.lang.NoClassDefFoundError的:com.mysql.jdbc.jdbc2.optional.MysqlDataSource
            在com.ryzomarmory.crm.ryzomarmory.DataSourceFactory.getMySQLDataSource(DataSourceFactory.java:19)
            在com.ryzomarmory.crm.ryzomarmory.LoginService<&初始化GT;(LoginService.java:13)
            在com.ryzomarmory.crm.ryzomarmory.LoginActivity<&初始化GT;(LoginActivity.java:18)
            在java.lang.reflect.Constructor.newInstance(本机方法)
            在java.lang.Class.newInstance(Class.java:1572)
            在android.app.Instrumentation.newActivity(Instrumentation.java:1065)
            在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)
            在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            在android.app.ActivityThread.access $ 800(ActivityThread.java:144)
            在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1278)
            在android.os.Handler.dispatchMessage(Handler.java:102)
            在android.os.Looper.loop(Looper.java:135)
            在android.app.ActivityThread.main(ActivityThread.java:5221)
            在java.lang.reflect.Method.invoke(本机方法)
            在java.lang.reflect.Method.invoke(Method.java:372)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:899)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我跑的命令 gradlew.bat干净应用程序目录,因为在大多数类似的问题建议。但是,这并没有解决我的问题。

编辑:code在这个尝试块导致错误:

 进口javax.sql.DataSource的;进口com.mysql.jdbc.jdbc2.optional.MysqlDataSource;//建立一个持久的数据库连接
公共类DataSourceFactory {    公共静态数据源getMySQLDataSource(){
        MysqlDataSource mysqlDS = NULL;
        最终配置的conf =新配置();
        最后弦乐dbHostName = conf.getDbHostname();
        最后弦乐dbDatabaseName = conf.getDbDatabaseName();
        最后弦乐数据库用户名= conf.getDbUsername();
        最后弦乐DBPASSWORD = conf.getDbPassword();        尝试{
            mysqlDS =新MysqlDataSource();
            mysqlDS.setURL(dbHostName + dbDatabaseName);
            mysqlDS.setUser(数据库用户名);
            mysqlDS.setPassword(DBPASSWORD);
        }赶上(例外五){
            抛出新IllegalStateException异常(E);
        }
        返回mysqlDS;
    }
}


解决方案

而你的Andr​​oid应用程序直接连接到一个数据库JDBC上不建议,请参阅this对于为何发布通过马克·墨菲。这在技术上是可行的,但你要砍左右,这是不值得的,你应该投资的精力投入到正确的做这件事,通过Web服务接口。

在理想情况下,你会想包你的数据库调用在Web服务中,有一个坐的应用程序服务器上的某个地方,有你的应用程序通过REST交互来获取和更新数据。

引入REST层的一个好处是,你也可以在除了移动应用或iOS等。

一个Web前端

I added the .jar file to the lib folder in the project directory:

Next I right clicked on each .jar file and selected "Add as library".

Then I added the dependencies to the build.gradle file:

apply plugin: 'com.android.application'

    android {
        compileSdkVersion 21
        buildToolsVersion "21.1.2"

        defaultConfig {
            applicationId "com.ryzomarmory.crm.ryzomarmory"
            minSdkVersion 16
            targetSdkVersion 21
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }

    dependencies {
        compile fileTree(dir: 'lib', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:21.0.3'
        compile files('commons-dbcp-1.4.jar')
        compile files('commons-pool-1.6.jar')
        compile files('mysql-connector-java-5.1.30-bin.jar')
    }

When I attempt to run the android application it displays the java.lang.NoClassDefFoundError. Here is the full log:

02-26 11:13:54.671  20960-20960/com.ryzomarmory.crm.ryzomarmory E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.ryzomarmory.crm.ryzomarmory, PID: 20960
    java.lang.NoClassDefFoundError: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
            at com.ryzomarmory.crm.ryzomarmory.DataSourceFactory.getMySQLDataSource(DataSourceFactory.java:19)
            at com.ryzomarmory.crm.ryzomarmory.LoginService.<init>(LoginService.java:13)
            at com.ryzomarmory.crm.ryzomarmory.LoginActivity.<init>(LoginActivity.java:18)
            at java.lang.reflect.Constructor.newInstance(Native Method)
            at java.lang.Class.newInstance(Class.java:1572)
            at android.app.Instrumentation.newActivity(Instrumentation.java:1065)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

I ran the command gradlew.bat clean in the app directory, as suggested in most similar questions. But this doesn't solve the issue for me.

edit: The code in this try block is causing the error:

import javax.sql.DataSource;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

// establishes a persistent database connection
public class DataSourceFactory {

    public static DataSource getMySQLDataSource() {
        MysqlDataSource mysqlDS         = null;
        final Configuration conf        = new Configuration();
        final String dbHostName         = conf.getDbHostname();
        final String dbDatabaseName     = conf.getDbDatabaseName();
        final String dbUsername         = conf.getDbUsername();
        final String dbPassword         = conf.getDbPassword();

        try {
            mysqlDS = new MysqlDataSource();
            mysqlDS.setURL(dbHostName + dbDatabaseName);
            mysqlDS.setUser(dbUsername);
            mysqlDS.setPassword(dbPassword);
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
        return mysqlDS;
    }
}

解决方案

Having your android app connect directly to a DB over JDBC is not advised, see this post by Mark Murphy for reasons why. It is technically possible, but you have to hack around, it's not worth it, you should invest that effort into doing it properly, by interfacing with a web service.

Ideally you'll want to wrap up your database calls in a web service, have that sitting on an application server somewhere and have your app interact via REST to fetch and update data.

A benefit of introducing a REST layer is that you could also have a web front end in addition to a mobile app, or iOS etc..

这篇关于Android的工作室 - java.lang.NoClassDefFoundError的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆