Android 工作室 - java.lang.NoClassDefFoundError
Android Studio - java.lang.NoClassDefFoundError
我在项目目录的lib
文件夹中添加了.jar
文件:
接下来我右键单击每个 .jar 文件并选择 "Add as library"。
然后我将依赖项添加到 build.gradle 文件中:
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')
}
当我尝试 运行 android 应用程序时,它显示 java.lang.NoClassDefFoundError
。这是完整的日志:
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.access0(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)
我运行 应用程序目录中的命令gradlew.bat clean
,正如大多数类似问题中所建议的那样。但这并不能为我解决问题。
编辑:此 try
块中的代码导致错误:
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;
}
}
转到项目的 "libs" 文件夹,select 并右键单击您的 library.jar、Select "Add As Library..."。 Select 好的。清除项目并再次运行。
希望对您有所帮助。
不建议让您的 android 应用通过 JDBC 直接连接到数据库,请参阅 Mark Murphy 的 this post 了解原因。这在技术上是可行的,但您必须四处寻找,这是不值得的,您应该通过与 Web 服务接口来投入精力以正确地做到这一点。
理想情况下,您希望将数据库调用包装在 Web 服务中,将其置于某处的应用程序服务器上,并让您的应用程序通过 REST 进行交互以获取和更新数据。
引入 REST 层的一个好处是,除了移动应用程序或 iOS 等之外,您还可以拥有 Web 前端。
我在项目目录的lib
文件夹中添加了.jar
文件:
接下来我右键单击每个 .jar 文件并选择 "Add as library"。
然后我将依赖项添加到 build.gradle 文件中:
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')
}
当我尝试 运行 android 应用程序时,它显示 java.lang.NoClassDefFoundError
。这是完整的日志:
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.access0(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)
我运行 应用程序目录中的命令gradlew.bat clean
,正如大多数类似问题中所建议的那样。但这并不能为我解决问题。
编辑:此 try
块中的代码导致错误:
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;
}
}
转到项目的 "libs" 文件夹,select 并右键单击您的 library.jar、Select "Add As Library..."。 Select 好的。清除项目并再次运行。
希望对您有所帮助。
不建议让您的 android 应用通过 JDBC 直接连接到数据库,请参阅 Mark Murphy 的 this post 了解原因。这在技术上是可行的,但您必须四处寻找,这是不值得的,您应该通过与 Web 服务接口来投入精力以正确地做到这一点。
理想情况下,您希望将数据库调用包装在 Web 服务中,将其置于某处的应用程序服务器上,并让您的应用程序通过 REST 进行交互以获取和更新数据。
引入 REST 层的一个好处是,除了移动应用程序或 iOS 等之外,您还可以拥有 Web 前端。