【问题标题】:Javac not running annotation processorsJavac没有运行注释处理器
【发布时间】:2018-07-05 20:16:41
【问题描述】:

问题

我正在重新审视一个我至少一年没有接触过的 maven 项目。我很确定当我离开它时它编译成功(target 目录中仍有一个工作 jar),但现在编译失败,因为生成的类丢失。

我尝试了什么

  • 已验证target/generated-sources/annotations 中确实没有来源(不存在
  • 确保没有使用 -proc:none 调用 javac(不是
  • 运行 mvn clean dependency:unpack-dependencies -Dmdep.useSubDirectoryPerArtifact=true 以确保预期的依赖项位于类路径上,并且它们包含有效的 META-INF/services/javax.annotation.processing.Processor 条目(有多个,包括 org.immutables.processor.ProxyProcessor
  • 遵循How to make sure javac is using an annotation processor and troubleshoot when it is not 的这些步骤:
    1. 从 maven 调试日志中获取 javac 选项
    2. 删除-nowarn 选项并添加-verbose -XprintRounds -XprintProcessorInfo -Xlint -J-verbose。注意:我还必须添加主类的相对路径,否则 javac 会抱怨没有源。
    3. 验证是否加载了处理器类(不存在
    4. 查找至少一个处理循环日志(不存在
    5. 确保注释存在于循环日志列表中(没有循环日志
  • 为 javac 命令添加了-proc:only 选项
  • 还在 javac 命令中添加了-processor org.immutables.processor.ProxyProcessor处理器现已加载,但仍然没有打印回合,也没有生成类)
  • 将处理器选项更改为 -processor org.immutables.processor.ProxyProcessorXXX 以查看它是否会有所作为(确实如此,它现在会打印一条警告,指出使用 proc:only 请求处理,但未找到处理器)
  • 如果我不使用 -processor 选项,检查是否出现该警告,这应该使 javac 从类路径中检测处理器(它没有显示警告,这表明它是检测处理器但日志没有显示任何迹象)
  • 从 JDK1.8 切换到 JDK9(使用 jenv)后在上面尝试过
  • 安装了 Zulu 1.7 并在切换到它后在上面尝试(使用 jenv)

可能的因素

  • 我完全干净地安装了 macOS
  • 我之前运行过 macOS Sierra,目前运行的是 High Sierra
  • 在我没有安装 JDK9 之前
  • 我很久以前就改用 Gradle,所以我可能忘记了有关 maven 的一个重要细节

命令选项

这是我当前使用的 javac 命令:

javac -d ./target/classes -classpath ./target/classes:$HOME/.m2/repository/com/google/dagger/dagger/2.4/dagger-2.4.jar:$HOME/.m2/repository/com/google/dagger/dagger-compiler/2.4/dagger-compiler-2.4.jar:$HOME/.m2/repository/com/google/auto/factory/auto-factory/1.0-beta3/auto-factory-1.0-beta3.jar:$HOME/.m2/repository/org/immutables/builder/2.3.9/builder-2.3.9.jar:$HOME/.m2/repository/org/immutables/value/2.3.9/value-2.3.9.jar:<LONG LIST OF DIRECT AND TRANSITIVE DEPENDENCIES HERE> -sourcepath ./src/main/java: -s ./target/generated-sources/annotations -verbose -XprintRounds -XprintProcessorInfo -Xlint -J-verbose -processor org.immutables.processor.ProxyProcessor -proc:only ./src/main/java/com/mycompany/myproject/Main.java

注意:为了更好的可读性,我将每个参数放在一个新行上,将绝对路径替换为 $HOME/./,并省略了大部分依赖项。

问题

我在这里缺少什么?任何建议或指示将不胜感激。

【问题讨论】:

  • 谢谢,看起来很有希望。我不认为问题可能出在不可变对象上,但不幸的是我在日志中没有看到任何此类错误。还尝试了另一个版本的不可变对象,但这并没有什么不同。似乎根本没有进行处理。
  • 实际上,@yegodm,您提到的问题似乎确实相关;虽然没有打印出此类错误,但当我尝试编译一个具有不可变注释的特定类时,它会按预期工作。奇怪的是,所有注释处理器都不再运行。我会进一步调查。
  • 问题线程提到的一件事是添加-Xmaxerrs 100000(我还添加了-Xmaxwarns 100000),否则javac 可能不会打印最相关的信息,因为它超过了默认的错误/警告限制。我也用 Maven 尝试过,但不幸的是它无法处理这些标志:stackoverflow.com/a/3358578
  • 如果您创建一个新的bare maven 项目,其中只有几个使用相同注解的类,并检查它是否按照您的需要编译?

标签: java maven code-generation javac


【解决方案1】:

据我所知,maven 会为生成的源生成标记文件或标记目录(以点开头)。不过也是很久以前的事了……

【讨论】:

    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多