与天地兮比寿,与日月兮齐光。这篇文章主要讲述Android Studio 升级到3.0 提示 java.lang.NoClassDefFoundError相关的知识,希望能为你提供帮助。
android Studio 升级到3.0 提示 java.lang.NoClassDefFoundError
这个问题折腾了2个小时,最后解决了,Stack Overflow 上也有一次类似的问题,但是没有人提供解答。解决方法首先把方法写出来,起因和经过和原理写在后面,时间仓促的直接看解决方法吧。
这个错误的意思是运行时没有找到类,所以一般是你编译通过了但是无法运行。
写完这个就去解答,希望更多的人看到并避免,节省大家的精力。
一般出现这个错都是使用的
provided
导致的例如,我的旧配置如下:
Project build.gradle
文件:buildscript {
dependencies {
classpath '
com.android.tools.build:gradle:3.0.1'
// need delete in gradle3.x version
classpath '
com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
Module build.gradle
文件:apply plugin: '
com.android.library'
apply plugin: '
android-apt'
android {
// ...
}configurations {
provided
}dependencies {
// ...
// Fyber Annotations
provided '
com.fyber:fyber-annotations:1.3.0'
apt '
com.fyber:fyber-annotations-compiler:1.4.0'
// ...
}
改为最新的build.gradle3.x 的配置:
Project build.gradle
文件:buildscript {
dependencies {
classpath '
com.android.tools.build:gradle:3.0.1'
}
}
Module build.gradle
文件:apply plugin: '
com.android.library'
android {
// ...
// add this code to enable annotationProcessor
javaCompileOptions {
annotationProcessorOptions {
includeCompileClasspath = true
}
}
}dependencies {
// ...
// Fyber Annotations
compileOnly '
com.fyber:fyber-annotations:1.3.0'
annotationProcessor '
com.fyber:fyber-annotations-compiler:1.4.0'
// ...
}
更改完以上配置在
build Project
后即可成功运行了。如果不能请往下看:注意事项:上面的
Module build.gralde
的配置必须写在使用注解所在的 Module
中!例如我在
Module A
中的 MainActivity
使用了 @FyberSDK
的注解,那么我将上述配置写在Module A
的build.gralde
文件中。@FyberSDK
public class MainActivity extends BaseActivity<
MainPresenter, MainModel>
implements
IBannerDelegate, IMainView,
View.OnClickListener {
//....
}
补充相关知识关于 apt 的介绍
1、什么是APT?其他
APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,根据注释自动生成代码。Annotation处理器在出来Annotation时可以根据源文件中的Annotation生成额外的源文件和其它的文件(文件具体内容由Annotation处理器的编写者决定),APT还会编译生成的源文件和原来的源文件,将它们一起生成class文件。
2、annotationProcessor
annotationProcessor是APT工具中的一种,他是google开发的内置框架,不需要引入,可以直接在build.gradle文件中使用
3、android-apt
android-apt是由一位开发者自己开发的apt框架,源代码托管在这里,随着Android Gradle 插件 2.2 版本的发布,Android Gradle 插件提供了名为 annotationProcessor 的功能来完全代替 android-apt ,自此android-apt 作者在官网发表声明最新的Android Gradle插件现在已经支持annotationProcessor,并警告和或阻止android-apt ,并推荐大家使用 Android 官方插件annotationProcessor。
新配置 | 对应的过时配置 | 描述 |
---|---|---|
implementation | compile | module编译时可用,module的使用者运行时可用,对于大量使用library的项目,可以显著提高编译时间,因为它可以减少构建系统重新编译一些module.大多数app/test因为使用这种配置 |
api | compile | module编译时可用,module的使用者编译和运行时可用,这个和过时的compile一样的。一般是library模块会使用它,如果app模块一定要使用它,必须是在它想暴露api给test模块使用 |
compileOnly | provided | module 编译时可用,但是module的使用者,在编译和运行时均不可用。跟过时的provided一样的。 |
runtimeOnly | apk | module和它的使用者,运行时可用.它跟过时的apk是一样. |
【Android Studio 升级到3.0 提示 java.lang.NoClassDefFoundError】当你遇到坑时可以参考:
官方的升级3.0指南
填坑系列Android Studio 3.0配置更改
推荐阅读
- spring 3.2.7 applicationContext.xml
- android将应用中图片保存到系统相册并显示
- 关于控制台输出 警告 log4j:WARN No appenders could be found for logger
- 关于Androidstudio无法获取到所有的SDk版本,需要挂国内镜像的问题
- android.animation - ValueAnimator-ofObject(TypeEvaluator evaluator, Object... values)
- Tomcat下wtpwebapps文件夹 和 webapps文件夹区别
- Android五大布局介绍&属性设置大全
- 使用Facebook的create-react-app脚手架快速构建React开发环境(ant.design,redux......)
- Android模拟器 Genymotion