一、前言
在使用过一些知名框架如butterknife之后,发现原来还可以通过编译时注解来生成java类,于是准备大干一场却没想到被idea和gradle难住了!!!一连查了两天,终于被我解决了。
二、问题
在idea+gradle的环境中使用annotation processor生成代码,但是代码生成在了build文件夹下的classes里,且程序无法引用生成的类,若强行使用则报错找不到类
三、解决方法
- 第一步 配置idea
file -> settting -> Build,Execution,Deployment -> compiler -> annotation processor 进入此界面,然后按照图示操作
- 第二步 配置gradle,使编译时将文件生成到指定目录
compileJava {
//配置编译时生成代码的目录
options.compilerArgs << "-s"
options.compilerArgs << "$projectDir/src/main/generated/java"
//确保文件夹存在
doFirst {
file(new File(projectDir, "/src/main/generated/java")).mkdirs()
}
}
//在clean时删除编译生成的代码
clean.doLast {
// clean-up directory when necessary
file(new File(projectDir, "/src/main/generated")).deleteDir()
}
- 第三步 配置文件夹类型
在执行gradle的build任务后,会在src/main下生成指定目录以及代码,但是在我们的源文件中依然没有提示,那么我们需要指定其文件夹类型,如下图
在此之后就可以愉快的生成代码了
四、需要注意的细节
- 在编写自定义Processor可能会出现处理器不起作用的情况
答:其很有可能是你将Processor.class写成了Process.class
//正确的写法
@AutoService(Processor.class)
//错误的写法
@AutoService(Process.class)
-
即使是按照上面的步骤配置,但仍然无法引用生成的代码(删除线即当时认知错误,在第4点会讲原因)
答:可能是由于你生成代码的文件夹与你的源文件不在一个module中,由于idea中使用gradle创建一个module,他会识别为三个module ,如下图如果你的生成代码不在这个路径内,那么他不属于这个module,所以无法引用
我只是创建了一个Test module,但是他识别为三个。其中的test_main module就是我们日常开发的module,其路径是**/Test/src/main**, -
annotation processor 生成类时报异常:错误: 类重复: com.cxyz.test.Test
答:其实annotation processor只能生成额外的类,而不能在原先类的基础上做改动 -
其实第2点中idea识别为三个module的原因是你在创建项目的时候勾选了如下图的选项,取消勾选就行了: