我正在尝试向我的Android项目添加注释处理器,但是我收到一条错误消息,指出无法找到AbstractProcessor
。我在此期间创建了一个单独的Java项目,但我宁愿将所有内容保存在一个Android项目中。在我的项目中包含AbstractProcessor
的最佳方法是什么?我使用的是AndroidStudio和Gradle。
更新
我重新打包javax.annotation
,javax.lang.model
和javax.tools
,以便位于我项目的命名空间(as per these instructions)下。我包含一个资源/ META-INF / services / javax.annotation.processing.Processor,它包含我的AbstractProcessor
子类的完整类名,所有内容编译都很好。但是,处理器永远不会运行。
修改 简而言之,我有一个Android库项目,它为方法提供注释。我想提供一个处理器,如果注释使用不正确,会导致编译时错误。如果我尝试将处理器放入Android库项目中,Gradle将无法构建它,因为找不到javax。*类。我能让它工作的唯一方法是在库项目中创建一个java模块,并将处理器放在那里。但是,这意味着我必须在我想要使用此批注的任何项目中有2个依赖项;一个用于获取注释,另一个用于获取处理器。
答案 0 :(得分:5)
好的,我认为这里存在一些巨大的误解。首先,您不必将javax.*
中的任何内容打包到您的应用程序中。注释处理器在编译时运行,并在该阶段完成其所有工作。之后,它可以生成一些文件或配置项目等,这些文件将打包到应用程序中。注释处理器(及其javax.*
依赖项)将不会,因为应用程序在运行时不需要处理器。只有开发人员在构建项目时才需要它。
基于蚂蚁的建筑也被弃用了。你应该使用Android gradle(官方)或maven(非官方)插件。
您可以要求处理器在编译时仍然需要依赖项。这是事实,但javax.*
类是由构建项目的编译器提供的。在命令行构建和基于IntelliJ的IDE的情况下,JDK APT提供它,在Eclipse的情况下,Eclipse JDT APT插件提供类。
如果您想将注释处理器添加到Android gradle项目,请查看我们在AndroidAnnotations中的example。您应该注意android-apt
插件的使用,它正确地添加了编译时依赖项(处理器),并且还设置了源路径,因此IntellJ可以在不进行手动配置的情况下选择它们。
对编辑的反思:
不幸的是,您应该将处理器移动到单独的项目中。这是它可以工作的唯一方式,顺便说一下它是注释处理器的自然方式。例如,dagger
和AndroidAnnotations
也有此设置(但原因略有不同)。
是的,这意味着你必须添加两个依赖项,但你必须处理它。或者,您可以将库添加为处理器所需的dep。在这种情况下,用户只需要将处理器添加为依赖项,因为lib也将作为传递dep添加。但这很安静,因为lib是这里的主要部分,处理器只是验证其正确用法的工具(如果我理解你的编辑好的话)。