在尝试使用’org.javassist:javassist:3.27.0-GA’进行自定义gradle插件时,
遇到报错
FileSystemException
当前报错的项目工程中 gradle插件是:classpath 'com.android.tools.build:gradle:3.4.2' gradle版本是 :distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
Caused by: java.util.concurrent.ExecutionException:
java.nio.file.FileSystemException:
D:\android-studio\包名\build\intermediates\runtime_library_classes\debug\classes.jar:
另一个程序正在使用此文件,进程无法访问。
解决方案
删除(终止)占用该classes.jar文件的进程。报错时,在任务管理页面截图的详细信息中java.exe进程有三个。然后全部删除,并重新构建工程,构建成功后显示两个java.exe进程。
在IOC框架研究使用DI(依赖注入),Hilt 进行对象注入时。
IOC框架下有三种注入方式: view注入: 如ButterKnife 参数注入: 如Arouter 对象注入: 如Dagger2,Hilt
Hilt NoClassDefFoundError
当前报错的项目工程中 gradle插件是:classpath 'com.android.tools.build:gradle:3.4.2' gradle版本是 :distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
2022-05-18 09:40:42.941 27105-27105/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: 包名, PID: 27105
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/包名/MainActivity_GeneratedInjector;
at 包名.Hilt_MainActivity.inject(Hilt_MainActivity.java:53)
包名.Hilt_MainActivity.onCreate(Hilt_MainActivity.java:28)
at 包名.MainActivity.onCreate(MainActivity.java:32)
解决方案
本地修改当前gradle版本号到distributionUrl=file:///C:/Users/Administrator/.gradle/wrapper/dists/gradle-6.4.1-all.zip (这个报错出现在gradle未下载完全导致)或者使用vpn执行构建下载distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
然后请确认以下自己AS下Settings和Project Structure的配置,
GradleException: ‘buildSrc’
* Exception is:
org.gradle.api.GradleException: 'buildSrc' cannot be used as a project name as it is a reserved name
at org.gradle.initialization.DefaultSettingsLoader.lambda$validate$0(DefaultSettingsLoader.java:146)
at org.gradle.initialization.DefaultSettingsLoader.validate(DefaultSettingsLoader.java:142)
at org.gradle.initialization.DefaultSettingsLoader.findSettingsAndLoadIfAppropriate
解决方案
在创建buildSrc该module时,ide会自动将该module引入到setttings.gradle中,因此会报上面错误。在settings.gradle中删除include ':buildSrc’即可。
Groovy语言与Java相较 Groovy语言是基于JVM虚拟机的动态语言,Java是静态语言,Groovy完全兼容Java。 Groovy def关键字,def关键字用于定义Groovy中的无类型变量或动态返回类型的函数。 Groovy语法上分号不是必须的(该特点和kotlin一样),Java分号是必须的。 Groovy语法上单引号和双引号都能定义一个字符串,单引号不能对字符串中表达式做运算,双引号可以。Java单引号定义字符,双引号定义字符串。 Groovy语言声明一个List集合使用中括号,Java声明List集合使用大括号。(Groovy访问元素list[0]如范围索引1..3,-1表示右侧第一个等 ,Java访问元素list.get(0)) Groovy语言在声明map时使用中括号(访问map[key]、map.key,遍历map.each{item->...} ),Java使用大括号。 Groovy语法在执行调用一个方法时,括号可以不写。Java则是必须的。 Groovy语法的return不是必须的,这个和kotlin一样。 Groovy语法的闭包有话说(与kotlin 如出一辙)
def closureMethod () {
def list = [1,2,3,4,5,6]
list.each({println it})
list.each({
println it
})
list.each(){
println it
}
list.each{
println it
}
}
(在gradle文件中)Groovy语言在定义一个任务时,(脚本即代码,代码也是脚本)
task customTask1 {
doFirst {
println 'customTask1方法第一个执行到的方法'
def date = new Date()
def datef = date.format('yyy-MM-dd)
println "脚本即代码,代码也是脚本。当记得这一点才能时刻使用Groovy、Java和Gradle的任何语法和API来完成你想要做的事情。像这里,当前已格式化的日期:${datef}"
}
doLast {
println 'customTask1方法最后一个执行到的方法'
}
}
tasks.create ('customTask2') {
doFirst {
println 'customTask2方法第一个执行到的方法'
}
doLast {
println 'customTask2方法最后一个执行到的方法'
}
}
customTask2.doFirst {
print '查看在project中是否有task=customTask2 = '
println project.hasProperty('customTask2')
}
(在gradle文件中)Groovy创建任务的方式大概有5种
task newOwnerTask5
newOwnerTask5.description = '扩展任务属性-描述'
newOwnerTask5.group = BasePlugin.BUILD_GROUP
newOwnerTask5.doFirst {
println "我们创建Task任务都会成为Project的一个属性,属性名就是任务名"
}
tasks['newOwnerTask5'].doFirst {
println "任务都是通过TaskContanier创建的,TaskContanier是我们创建任务的集合,在Project中我们可以用通过tasks属性访问TaskContanier。所以可以以访问集合元素方式访问已创建的任务。"
}
def Task newOwnerTask1 = task(newOwnerTask1)
newOwnerTask1.doFirst {
println '创建方法的原型为:Task task(String name) throws InvalidUserDataException'
}
def Task newOwnerTask2 = task(newOwnerTask2, group:BasePlugin.BUILD_GROUP)
newOwnerTask2.doFirst {
println '创建方法的原型为:Task task(String name, Map<String,?> arg) throws InvalidUserDataException'
println "任务分组:${newOwnerTask2.group}"
}
task newOwnerTask3 {
description '演示任务的创建'
doFirst {
println "任务的描述:${description}"
println "创建方法的原型:Task task(String name, Closure closure)"
}
}
tasks.create("newOwnerTask4") {
description '演示任务的创建'
doFirst {
println "任务的描述:${description}"
println "创建方法的原型:Task create(String name, Closure closure) throws InvalidUserDataException"
}
}
task (helloFlag).doLast {
println '<< 作为操作符,在gradle的Task上是doLast方法的短标记形式'
}
|