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