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 会抱怨没有源。
验证是否加载了处理器类(不存在)
查找至少一个处理循环日志(不存在)
确保注释存在于循环日志列表中(没有循环日志)
-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 不被识别为内部或外部命令、可运行程序或批处理文件 [关闭]
windows 10 java命令可以运行,但是‘javac‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件(已解决)