IDEA+Gradle使用Annotation Processor

IDEA+Gradle使用Annotation Processor

    • 一、前言
    • 二、问题
    • 三、解决方法
    • 四、需要注意的细节
    • 五、参考文章

一、前言

在使用过一些知名框架如butterknife之后,发现原来还可以通过编译时注解来生成java类,于是准备大干一场却没想到被idea和gradle难住了!!!一连查了两天,终于被我解决了。

二、问题

在idea+gradle的环境中使用annotation processor生成代码,但是代码生成在了build文件夹下的classes里,且程序无法引用生成的类,若强行使用则报错找不到类

三、解决方法

  • 第一步 配置idea
    file -> settting -> Build,Execution,Deployment -> compiler -> annotation processor 进入此界面,然后按照图示操作
    IDEA+Gradle使用Annotation Processor_第1张图片- 第二步 配置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下生成指定目录以及代码,但是在我们的源文件中依然没有提示,那么我们需要指定其文件夹类型,如下图
    IDEA+Gradle使用Annotation Processor_第2张图片IDEA+Gradle使用Annotation Processor_第3张图片
    在此之后就可以愉快的生成代码了

四、需要注意的细节

  1. 在编写自定义Processor可能会出现处理器不起作用的情况
    答:其很有可能是你将Processor.class写成了Process.class
	//正确的写法
	@AutoService(Processor.class)	
	//错误的写法
	@AutoService(Process.class)
  1. 即使是按照上面的步骤配置,但仍然无法引用生成的代码(删除线即当时认知错误,在第4点会讲原因)
    答:可能是由于你生成代码的文件夹与你的源文件不在一个module中,由于idea中使用gradle创建一个module,他会识别为三个module ,如下图
    IDEA+Gradle使用Annotation Processor_第4张图片我只是创建了一个Test module,但是他识别为三个。其中的test_main module就是我们日常开发的module,其路径是**/Test/src/main**,
    如果你的生成代码不在这个路径内,那么他不属于这个module,所以无法引用

  2. annotation processor 生成类时报异常:错误: 类重复: com.cxyz.test.Test
    答:其实annotation processor只能生成额外的类,而不能在原先类的基础上做改动

  3. 其实第2点中idea识别为三个module的原因是你在创建项目的时候勾选了如下图的选项,取消勾选就行了:
    IDEA+Gradle使用Annotation Processor_第5张图片

五、参考文章

  1. http://www.it1352.com/830868.html
  2. https://stackoverflow.com/questions/34188732/get-intellij-to-recognize-classes-generated-by-annotationprocessor

你可能感兴趣的:(java)