Javac没有运行注释处理器

Posted

技术标签:

【中文标题】Javac没有运行注释处理器【英文标题】:Javac not running annotation processors 【发布时间】: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 的这些步骤:
    从 maven 调试日志中获取 javac 选项 删除-nowarn 选项并添加-verbose -XprintRounds -XprintProcessorInfo -Xlint -J-verbose。注意:我还必须添加主类的相对路径,否则 javac 会抱怨没有源。 验证是否加载了处理器类(不存在) 查找至少一个处理循环日志(不存在) 确保注释存在于循环日志列表中(没有循环日志
为 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/./,并省略了大部分依赖项。

问题

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

【问题讨论】:

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

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

【讨论】:

以上是关于Javac没有运行注释处理器的主要内容,如果未能解决你的问题,请参考以下文章

错误:仅当显式请求注释处理时才接受类名称错误

我path设置都没有问题,javac运行没有问题,但是java无法运行,OSK 运行不了,calc也不行,省略其中部分

javac 不是内部或外部文件 最佳处理方法

javac 不被识别为内部或外部命令、可运行程序或批处理文件 [关闭]

JAVAC

windows 10 java命令可以运行,但是‘javac‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件(已解决)