繁体   English   中英

Javac没有运行注释处理器

[英]Javac not running annotation processors

问题

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

我试过的

  • 已验证target/generated-sources/annotations中确实没有源(不存在
  • 确保没有使用-proc:none调用 javac(不是
  • Ran mvn clean dependency:unpack-dependencies -Dmdep.useSubDirectoryPerArtifact=true以确保预期的依赖项位于类路径上,并且它们包含有效的META-INF/services/javax.annotation.processing.Processor条目(的,有多个,包括org.immutables.processor.ProxyProcessor
  • 遵循如何确保 javac 正在使用注释处理器并在未使用时进行故障排除中的这些步骤:
    1. 从 maven 调试日志中获取 javac 选项
    2. 删除-nowarn选项并添加-verbose -XprintRounds -XprintProcessorInfo -Xlint -J-verbose 注意:我还必须添加主 class 的相对路径,否则 javac 会抱怨没有来源。
    3. 验证处理器的 class 是否已加载(不存在
    4. 查找至少一个处理轮次日志(不存在
    5. 确保注释存在于循环日志列表中(无循环日志
  • 为 javac 命令添加了-proc:only选项
  • -processor org.immutables.processor.ProxyProcessor添加到 javac 命令(处理器现在已加载,但仍然没有打印轮次,也没有生成类)
  • 将处理器选项更改为-processor org.immutables.processor.ProxyProcessorXXX以查看它是否会有所作为(确实如此,它现在打印一条警告,指出使用proc:only请求处理,但未找到处理器)
  • 检查如果我不使用-processor选项是否出现该警告,这应该使 javac 从 class 路径检测处理器(它没有显示警告,这表明它正在检测处理器但日志没有显示任何迹象其中)
  • 从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/./替换了绝对路径,并且我省略了大多数依赖项。

问题

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

据我所知,maven为生成的源生成一个标记文件或标记目录(以点开头)。 但也是很久以前......

我们在 git 分支上遇到了同样的问题,而主分支构建良好。 根本原因原来是 a.java 源具有重复定义的私有 void function。 这个重复是由主分支的合并引起的。 起初我们没有注意到它,因为合并没有引起冲突。 Amazon Corretto 8 和 11 编译器出现此问题。 删除重复的私有 void function 后,java 编译器像以前一样开始生成源。

对于某些解析失败, javac似乎完全且静默地跳过注释处理。

对我来说,由于我的注释处理器没有运行,由合并错误引起的重复注释导致了数千次失败 - 所以真正的错误完全丢失了。

@Data @AllArgsConstructor @NoArgsConstructor @EqualsAndHashCode(callSuper = false)
@EqualsAndHashCode(callSuper = false)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM