问题标签 [annotation-processing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java 注释处理 Messager API 消息未显示
我有一些带有自定义注释的接口,用于添加元数据。具体来说,这些接口表示数据库中的表,注释说明接口应该映射到哪个表以及属性是哪些列。
我使用注释处理来生成代码文件,这些代码文件执行一些工作,例如从数据库加载数据等。如果所有需要的元数据都可用,我还有一个ValidationProcessor
应该验证接口等等。当我验证注释时,我想显示警告和错误,以便清楚什么不正确以及问题发生在哪里。
为了打印消息,我使用 Messager API。这是我使用的代码,kind
例如Kind.ERROR
,msg 是消息,元素是发生错误的元素(它是实现Element
接口的类型)。
根据我的互联网研究(包括关于 stackoverflow 的类似文章),这应该是正确显示消息的方式。然而,消息不显示。
我的问题是,有人知道可能出了什么问题吗?
eclipse - 在 Eclipse 中,如何注册由特定用户定义的 Java 注释处理器生成的标记类型
我已经按照本教程成功地为 Eclipse 创建了我自己的 Java 注释处理器。
"This is an error."
我传递给处理器中的方法调用的消息processEnv.getMessager().printMessage(Kind.ERROR, "This is an error", element)
已成功地作为一个标记出现在带注释的元素所在的编辑器中。
现在我想制作一个与该标记对应的快速修复插件。我应该使用哪种类型的标记来注册,<handledMarkerTypes>
以便plugin.xml
插件仅处理源自我的注释处理器的标记?
java - 编译时创建的类在 IntelliJ 中显示为不存在
动机:
我想尝试编译时注释处理是否适合我的问题。它需要开箱即用,没有编译器参数等。
当前状态:
我有:
- 注释
- 注释处理器
- 一个包含这两者的 .jar 和一个 javax.annotation.processing.Processor 文件,该文件在 META-INF/services 中包含我的处理器的FQCN
应该发生什么:
- 它应该自动检测处理器
- 它应该处理注释并创建一个新类(WiredAnnotated)
- 我应该能够在编译的一个步骤中使用这个类(而不是多个阶段)
- 我不想让编辑器接受这个类的生成(例如AndroidAnnotations 也管理这个)
实际发生的情况:
- 它自动检测处理器
- 它创建了一个新类(在 out/production/*/generated/ 中)
- 我可以使用这个类
- 源代码看起来不错
- 反编译的时候看起来也不错
- 编辑器无法解析类(见截图)
我尝试了什么:
- 重启 IntelliJ
- 使缓存失效
- 检查注释处理器的输出
截屏:
编译时,它实际上按预期工作。我想这与检查错误的目录有关。
有没有人知道我做错了什么?我是否错过了可以帮助您的信息?
在此先感谢,直到
android - Gradle + AndroidAnnotations 生成重复的类错误 - 需要在每次构建之前清理项目
我在使用 gradle 构建将我的 IntelliJ IDEA 项目迁移到 Android Studio 时遇到问题。我已经设置了 AndroidAnnotations 库,就像在其他各种帖子中推荐的那样,它工作得很好。但是,当多次编译我的项目而不执行:clean
中间任务时,我收到以下错误消息:
我相信多个系列构建失败,因为 AndroidAnnotations*_.java
总是在:compile
任务之前重新创建文件(不检查是否有必要)并且:compile
任务识别新文件(例如使用时间戳)但已经将这些文件找到为预编译*.class
文件,从而引发错误。这可能吗?如何防止这种行为?我可以为 AndroidAnnotations 添加必要性检查吗?还是这是其他问题?
更新 1:似乎错误是从 AndroidAnnotations 本身引发的,因为当我手动:compile
删除*.java
文件夹内的文件时有效。apt_generated
更新 2:
我从我的删除以下行build.gradle
:
我不完全知道为什么没有这条线它会起作用。由于我没有使用 Android Studio 的Mark Directory as > Sources Root
. 可能这是缓存的一些结果?或者 gradle 是否以某种方式将我生成的 java 文件自动添加到类路径中?
尽管如此,我仍将感谢任何评论。
更新 3 / 解决方案
删除该行并将 gradle 构建文件与 Android Studio 同步后,自动生成的源代码作为 Source Root 被删除,导致 IDE 显示缺少类的错误。
最终,我在 Android Annotations github 问题上找到了解决方案:https ://github.com/excilys/androidannotations/issues/676
我重新添加了将其添加到源集的语句(允许 Android Studio 将其显示为源根)。此外,我使用以下方法从变体源集合中删除了文件:
现在生成的文件被识别,重复的类错误消失了。
最好的问候,大卫
这是我最终的 build.gradle。我希望这对你们中的一些人有所帮助:
这是我的(初始)build.gradle
(我去掉了不相关的部分):
我将不胜感激任何帮助。
谢谢,大卫
java - 依赖于 android.os 的 Java 库在使用时会导致 NoClassDefFoundError
我在一个使用 android.os.Bundle 的项目(我称之为 JavaLibrary)中创建了一个 java 注释处理器。因此,该项目在其 gradle.build 依赖项中有以下行:
在 gradle.build 中,sourceCompatibility
都targetCompatibility
设置为 1.6 版,这个项目可以自己编译。
我还创建了一个依赖于 JavaLibrary 的 Android 库项目(我将其称为 AndroidLibrary)。我期待 JavaLibrary 处理 AndroidLibrary 中使用的一些注释并生成一些代码。
但是,当我尝试编译 AndroidLibrary 时,出现以下错误:
堆栈跟踪显示了在 JavaLibrary 中引用 android.os.Bundle 的行。
为什么会发生这种情况,我如何让这两个项目一起编译?
annotation-processing - 编译器 API + 注释处理 == 双诊断消息?
我将 Java Compiler API (JSR199) 与自定义注释处理器 (JSR269) 结合起来。提供给编译器的 Java 源代码中的一些语法错误会导致诊断消息出现两次。许多语法错误仍然只会导致一条诊断消息。例如,不匹配的大括号只会产生一条消息,但带有无效限定标识符的导入会产生两条诊断消息,但仅在使用注释处理器时。
以下是一些会导致问题的示例输入:
对于注释处理器,我有以下内容。(我尝试过从进程返回 false 并且我也尝试过手动实现处理器而不是扩展 AbstractProcessor。)
下面是一些用于调用编译器和添加注释处理器的代码。
我的输出看起来像:
如果我取出processors.add(ap);
线路,那么重复的错误消息就会消失。添加多个处理器没有额外的影响。
知道为什么注释处理器在使用编译器 API 时会导致重复的诊断消息吗?(并且仅针对某些语法错误)
android - Gradle + Annotations + Flavors = 不会运行注释处理器
我有一个使用注释处理器(Android Annotations)生成代码的 Gradle 构建脚本。在我添加新的Pro Flavor之前,建筑一直很好。我可以构建Free风格,但是当我构建Pro风格时,注释处理器没有运行。这会导致缺少代码并且构建失败。
这是我的脚本:
构建自由变体时,注释处理器按照 gradle 输出中的以下指示运行:
在构建Pro变体时,注释处理器不会运行,因此对生成代码的引用会失败。
奇怪的是,我发现(确实是偶然的)如果我packageName "com.MyCompany.MyApp.Pro"
从脚本中删除...注释处理器运行并且它会正确构建。我需要更新 Google Play 的包名称。
在 android studio 中查看时,您可以看到 apt(注释处理工具)显示Pro版本处于活动状态,即使我选择了FreeDebug构建变体。我不确定这是否表明存在问题,或者这是否只是 beta android studio(Android Studio 版本:0.2.13)的问题。所以,带着一粒盐。
我是 gradle 构建系统的新手,但我认为我已经掌握了它。我一遍又一遍地查看脚本,我不明白为什么注释处理器没有为pro变体运行。除了使用 --info 和 --debug 参数运行包装器之外,我还不知道如何调试这些问题。
我已经使用-info和-debug运行了 gradle 包装器以获取扩展输出,但没有任何内容表明任何其他错误(或缺少项目),直到它到达由缺少生成的代码引起的错误。所以这让我相信这只是 androidannotations 没有使用那个变体运行的事实,这是根本问题。(即我不认为这是由上游的某些东西引起的错误,后来被误报了。不过我可能是错的)
我真的很茫然,现在已经坚持了 2 天。
java - 如何使用 Java 7 和 Maven 在 Eclipse Kepler 中运行 JSR269 注释处理器
我正在使用 eclipse Kepler,编译器设置为使用 Java 7。我的类路径中有一个符合 JSR269 的注释处理器(在 maven 容器中)。
运行此注释处理器的最简单方法是什么?
实际上,我希望 Eclipse 编译在构建期间自动运行此注释处理器,因为它符合 JSR 269 - 但事实并非如此。为什么不——是出于性能原因?
注意:命令行中的 Maven 构建工作得很好。
经过一番研究,事实证明这可以在项目属性中进行配置(Java 编译器 - 注释处理 - 工厂路径)。这里的问题是我当然想使用已经在类路径(在 Maven 容器中)的注释处理器的 .jar 文件。我怎样才能参考它?我没有办法做到这一点。
我想出的最好方法是使用M2_REPO
变量,然后手动将路径附加到处理器,如下所示:
这显然有一个问题,即现在在 2 个地方指定了处理器:在 maven pom 文件中和 eclipse 项目中。如何避免这种情况?
java - 永远不会调用注释处理
我正在研究一个应该从 Annotations 生成 java 代码的小库。
我使用 maven 来构建它,但是注释并编写了一些单元测试,其中包含一些用 MyAnnotation 注释的类。
我的 pom.xml 文件如下所示:
我还尝试在 Eclipse 中使用带注释的类运行测试。我从我的库中生成了一个 jar,并将其设置为 Eclipse 中的 AnnotationProcessor。但是永远不会执行注释处理。
据我所知,生成的类文件应该放在 target/right 或者生成的 java 文件将存储在哪里?
有什么建议可能是错的吗?
java - 如何按源顺序获取方法
我有一个自定义注释,我想在运行时使用它来显示对象属性。我希望它们以源代码顺序出现,但反射不保证Class.getMethods()
.
有没有办法通过反射或注释处理来按源顺序获取方法(如果涉及多级继承,至少每个类)?
例如,假设我有一个界面Property
以及使用该注释的类
我想在属性“另一个”之前可靠地获得属性“第一”。
我知道我可以向我的注释添加一个排序属性并对其进行排序,但是如果需要,我有很多类需要更新,所以我正在寻找一种通用方法来实现这一点,而无需修改单个注释。