问题标签 [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.

0 投票
1 回答
1665 浏览

java - Java 注释处理 Messager API 消息未显示

我有一些带有自定义注释的接口,用于添加元数据。具体来说,这些接口表示数据库中的表,注释说明接口应该映射到哪个表以及属性是哪些列。

我使用注释处理来生成代码文件,这些代码文件执行一些工作,例如从数据库加载数据等。如果所有需要的元数据都可用,我还有一个ValidationProcessor应该验证接口等等。当我验证注释时,我想显示警告和错误,以便清楚什么不正确以及问题发生在哪里。

为了打印消息,我使用 Messager API。这是我使用的代码,kind例如Kind.ERROR,msg 是消息,元素是发生错误的元素(它是实现Element接口的类型)。

根据我的互联网研究(包括关于 stackoverflow 的类似文章),这应该是正确显示消息的方式。然而,消息不显示。

我的问题是,有人知道可能出了什么问题吗?

0 投票
0 回答
53 浏览

eclipse - 在 Eclipse 中,如何注册由特定用户定义的 Java 注释处理器生成的标记类型

我已经按照本教程成功地为 Eclipse 创建了我自己的 Java 注释处理器。

"This is an error."我传递给处理器中的方法调用的消息processEnv.getMessager().printMessage(Kind.ERROR, "This is an error", element)已成功地作为一个标记出现在带注释的元素所在的编辑器中。

现在我想制作一个与该标记对应的快速修复插件。我应该使用哪种类型的标记来注册,<handledMarkerTypes>以便plugin.xml插件仅处理源自我的注释处理器的标记?

0 投票
1 回答
322 浏览

java - 编译时创建的类在 IntelliJ 中显示为不存在

动机

我想尝试编译时注释处理是否适合我的问题。它需要开箱即用,没有编译器参数等。


当前状态

我有:

  • 注释
  • 注释处理器
  • 一个包含这两者的 .jar 和一个 javax.annotation.processing.Processor 文件,该文件在 META-INF/services 中包含我的处理器的FQCN

应该发生什么:

  • 它应该自动检测处理器
  • 它应该处理注释并创建一个新类(WiredAnnotated)
  • 我应该能够在编译的一个步骤中使用这个类(而不是多个阶段)
  • 我不想让编辑器接受这个类的生成(例如AndroidAnnotations 也管理这个)

实际发生的情况:

  • 它自动检测处理器
  • 它创建了一个新类(在 out/production/*/generated/ 中)
  • 我可以使用这个类
    • 源代码看起来不错
    • 反编译的时候看起来也不错
  • 编辑器无法解析类(见截图)

我尝试了什么:

  • 重启 IntelliJ
  • 使缓存失效
  • 检查注释处理器的输出

截屏:

在此处输入图像描述

编译时,它实际上按预期工作。我想这与检查错误的目录有关。

有没有人知道我做错了什么?我是否错过了可以帮助您的信息?

在此先感谢,直到

0 投票
2 回答
2949 浏览

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(我去掉了不相关的部分):

我将不胜感激任何帮助。

谢谢,大卫

0 投票
1 回答
267 浏览

java - 依赖于 android.os 的 Java 库在使用时会导致 NoClassDefFoundError

我在一个使用 android.os.Bundle 的项目(我称之为 JavaLibrary)中创建了一个 java 注释处理器。因此,该项目在其 gradle.build 依赖项中有以下行:

在 gradle.build 中,sourceCompatibilitytargetCompatibility设置为 1.6 版,这个项目可以自己编译。

我还创建了一个依赖于 JavaLibrary 的 Android 库项目(我将其称为 AndroidLibrary)。我期待 JavaLibrary 处理 AndroidLibrary 中使用的一些注释并生成一些代码。

但是,当我尝试编译 AndroidLibrary 时,出现以下错误:

堆栈跟踪显示了在 JavaLibrary 中引用 android.os.Bundle 的行。

为什么会发生这种情况,我如何让这两个项目一起编译?

0 投票
1 回答
734 浏览

annotation-processing - 编译器 API + 注释处理 == 双诊断消息?

我将 Java Compiler API (JSR199) 与自定义注释处理器 (JSR269) 结合起来。提供给编译器的 Java 源代码中的一些语法错误会导致诊断消息出现两次。许多语法错误仍然只会导致一条诊断消息。例如,不匹配的大括号只会产生一条消息,但带有无效限定标识符的导入会产生两条诊断消息,但仅在使用注释处理器时。

以下是一些会导致问题的示例输入:

对于注释处理器,我有以下内容。(我尝试过从进程返回 false 并且我也尝试过手动实现处理器而不是扩展 AbstractProcessor。)

下面是一些用于调用编译器和添加注释处理器的代码。

我的输出看起来像:

如果我取出processors.add(ap);线路,那么重复的错误消息就会消失。添加多个处理器没有额外的影响。

知道为什么注释处理器在使用编译器 API 时会导致重复的诊断消息吗?(并且仅针对某些语法错误)

0 投票
1 回答
5224 浏览

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)的问题。所以,带着一粒盐。

在 Android Studio 中构建文件夹

我是 gradle 构建系统的新手,但我认为我已经掌握了它。我一遍又一遍地查看脚本,我不明白为什么注释处理器没有为pro变体运行。除了使用 --info 和 --debug 参数运行包装器之外,我还不知道如何调试这些问题。

我已经使用-info-debug运行了 gradle 包装器以获取扩展输出,但没有任何内容表明任何其他错误(或缺少项目),直到它到达由缺少生成的代码引起的错误。所以这让我相信这只是 androidannotations 没有使用那个变体运行的事实,这是根本问题。(即我不认为这是由上游的某些东西引起的错误,后来被误报了。不过我可能是错的)

我真的很茫然,现在已经坚持了 2 天。

0 投票
1 回答
1172 浏览

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 项目中。如何避免这种情况?

0 投票
2 回答
1860 浏览

java - 永远不会调用注释处理

我正在研究一个应该从 Annotations 生成 java 代码的小库。

我使用 maven 来构建它,但是注释并编写了一些单元测试,其中包含一些用 MyAnnotation 注释的类。

我的 pom.xml 文件如下所示:

我还尝试在 Eclipse 中使用带注释的类运行测试。我从我的库中生成了一个 jar,并将其设置为 Eclipse 中的 AnnotationProcessor。但是永远不会执行注释处理。

据我所知,生成的类文件应该放在 target/right 或者生成的 java 文件将存储在哪里?

有什么建议可能是错的吗?

0 投票
2 回答
1420 浏览

java - 如何按源顺序获取方法

我有一个自定义注释,我想在运行时使用它来显示对象属性。我希望它们以源代码顺序出现,但反射不保证Class.getMethods().

有没有办法通过反射或注释处理来按源顺序获取方法(如果涉及多级继承,至少每个类)?

例如,假设我有一个界面Property

以及使用该注释的类

我想在属性“另一个”之前可靠地获得属性“第一”。

我知道我可以向我的注释添加一个排序属性并对其进行排序,但是如果需要,我有很多类需要更新,所以我正在寻找一种通用方法来实现这一点,而无需修改单个注释。