前言
很久以前使用写了一款Gradle插件为项目使用,但是使用Intellij idea写的,然后最近在复习写gradle插件,就在Android Studo里面写了,本人用的是2.2.3的Android Studio 一直没有换3.0,因为公司的电脑配置太辣鸡了,换了更不好用,太卡了。但是按照网上的教程,折腾了一天也不成功,一直报找不到插件的实现类,但是最后终于解决了,网上没有找到相关的答案,所以记录一下,有同样问题的小伙伴也可以看一下。
为什么会产生问题?
我这里就不演示如何创建groovy类型的moudle了 ,网上一大堆,例如
AndroidStudio中写Gradle插件
但是我按照这里面写下来会产生几个问题:
- 1 在groovy文件夹下创建一个xxx.groovy文件,但是无法识别为groovy文件,也就没有代码提示,但是我可以确定我们的groovy文件夹被识别了,因为groovy文件夹变成蓝色了。
- 2 在groovy文件夹下创建一个xxx文件,也就是不带groovy后缀,反而却自动识别为groovy文件了,因为可以写groovy的语法和右相关代码提示了。
那既然在这两个条件的前提下,我当然是选择了第二种,创建了一个名字为MyPlugin的文件,然后可以愉快的在里面写groovy的代码了,代码如下:
import org.gradle.api.Plugin
import org.gradle.api.Project
class MyPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
println 'fuck world'
}
}
然后大家看一下配置文件,完全没有问题:
但是在app中引用插件的时候,却一直报我开头那样的错误。Unable to load class ‘plugin.MyPlugn’,真是悲伤啊,开始的时候我推荐各种名字写错了 或者引用了对不上的,心情很烦躁,看了很多博客,都差不多,折腾了一天也没弄出来,最后平静下心情来好好的思考了一下,我觉得思考过程很重要,记录一下:
-
1 既然都报了unable to load class ‘plugin.MyPlugin’了,说明它已经引用了这个myplugin这个插件配置了,因为仔细观察你会发现,这个字符串就是implementation-class 后面指定的字符串。而且前面在为app moudle指定classpath等过程也没有出错。所以我断定,可能是找不到对应的class文件,然后我去repo的myplugin.jar去查看了一下,果然 MyPlugin.class根本就没有打入到jar包里面,那肯定找不到啊。。
本来以为我找不到解决方法了,却不想还是没解决,因为我发现,无论我如何重新build ,classes这个moudle都无法再对应的build下面生成对应的class文件。
真是整的人郁闷,后来我反复的试验,然后思考,为什么就是不生成呢,我突然想到,可能是因为MyPlugin这个文件,因为他是我用上面说的第二种方式,就是没有带.groovy后缀的形式创建的,他就和一个普通文件一样,编译的时候或许不识别呢?然后我就把MyPlugin重命名成为了MyPlugin.groovy,果然和我想象的一样:
生成了类文件,然后我欣喜若狂的去再一次upload到了maven,再去引用,然后还是报一样的问题。。整个人都要疯了啊,抑郁啊 憋屈啊,在最后快要崩溃的时候,我貌似发现了个问题。。。我写的包路径明明是plugin/MyPlugin,可是生成的class为什么只有一个MyPlugin.class类啊,他的包结构呢啊?因为我在properties指定实现类的时候是plugin.MyPlugin,没有包结构那肯定找不到啊。。后来我反复删了重新弄,检查,对比InteillJ中的项目,查看iml文件,怀疑是AndroidStudio的bug,等等都试了 全都不管用。崩溃。
不过最后我我还是找到了,原因还是因为创建文件的时候用了第二种方式,这种方式创建文件的时候,虽然能识别为groovy,但是有个问题:
我去他妈的,不为我自动生成package啊,那肯定不知道包结构啊。。真是坑爹啊!!!然后我感觉加上了package:
终于生成了合乎要求的结构了啊!!!这个时候我赶紧再次上传到本地maven,然后app中引用:
终于成功了啊,感动啊,坑爹啊。
如何解决
对了,最后总结一下,如果在AS3.0以下的AS创建gradle插件moudle可以用这样的步骤来做:
- 1 在groovy对应的包下面,创建不带后缀的file,记着先加上package定义包结构,然后编写代码
- 2 然后将文件改为有groovy后缀的,再用右侧的gradle任务重新build一下,查看build文件夹下的classes结构是否正确。
- 3 最后就可以上传到本地maven引用使用了。
最后注意一下: 只能使用创建file的模式来创建groovy文件,不能使用创建class或者选择groovy模板来创建。