【问题标题】:Eclipse annotation processing not finding class on classpathEclipse 注释处理未在类路径上找到类
【发布时间】:2020-07-10 01:39:48
【问题描述】:

我们将 Eclipse Annotation 处理与 Velocity 代码生成框架一起使用。 不久前,我们更新了所有代码和构建以使用 Java 11 - 并且没有注意到代码生成不再起作用。 (我们暂时不需要更改任何生成的代码。)

在更新各种 jar 并重建 Eclipse 插件后,它试图调用我们的代码生成处理器 - 但它收到了 DataModelClassWrapper 类的 NoClassDefFound 错误。这应该很容易解决,但是具有该类的 jar 已经在项目类路径中,并且在 Eclipse 注释 FactoryPath 中。我已经验证了 .class 也在 .jar 文件中。此外,VelocityCodeGenProcessor 类(错误的来源)与DataModelClassWrapper 在同一个 jar 和包中。

请注意,我们通过从中提取 .jar 并将其添加到项目的类路径和注释工厂路径中来使用“插件”。

此时我怀疑要么我遗漏了一些明显的东西,要么我发现了一些模糊的角落问题案例。 (很可能是前者)

eclipse.buildId=4.16.0.I20200604-0540
java.version=11.0.7
java.vendor=AdoptOpenJDK
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US
Framework arguments:  -product org.eclipse.epp.package.java.product
Command-line arguments:  -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.java.product

org.eclipse.jdt.apt.pluggable.core
Error
Wed Jul 08 17:13:06 PDT 2020
Exception thrown by Java annotation processor com.metrixsoftware.build.annotationProcessor.velocityCodeGen.VelocityCodeGenProcessor@2ccc9525

java.lang.Exception: java.lang.NoClassDefFoundError: Could not initialize class com.metrixsoftware.build.annotationProcessor.velocityCodeGen.DataModelClassWrapper
    at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:172)
    at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:124)
    at org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:171)
    at org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorManager.java:138)
    at org.eclipse.jdt.internal.compiler.Compiler.processAnnotationsInternal(Compiler.java:958)
    at org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:932)
    at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:450)
    at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:426)
    at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:386)
    at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:214)
    at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:345)
    at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:79)
    at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:275)
    at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:198)
    at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:832)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:220)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:263)
    at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:316)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:319)
    at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:371)
    at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:392)
    at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:154)
    at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:244)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.metrixsoftware.build.annotationProcessor.velocityCodeGen.DataModelClassWrapper
    at com.metrixsoftware.build.annotationProcessor.velocityCodeGen.DataModel.getWrapped(DataModel.java:35)
    at com.metrixsoftware.build.annotationProcessor.velocityCodeGen.DataModel.doAnalysis(DataModel.java:90)
    at com.metrixsoftware.build.annotationProcessor.velocityCodeGen.VelocityCodeGenProcessor.process(VelocityCodeGenProcessor.java:170)
    at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:142)
    ... 25 more

【问题讨论】:

    标签: java eclipse velocity annotation-processing


    【解决方案1】:

    不是一个好的答案,而是一个答案。 再次清理并重建,异常发生了变化。请注意,被报告为 Not Found 的特定类已经改变了几次 - 没有代码更改。 现在它抱怨找不到另一个类(来自 log4j 的 PropertiesUtil,它位于类路径中)。但是这个是从“DataModelClassWrapper”中引用的,这是它以前找不到的类。 检查 DataModelClassWrapper,发现它有一个未使用的字段,声明了一个从未使用过的 log4j Logger。所以我删除了它。 然后,突然之间,一切都开始工作了。

    我真的非常讨厌这种“修复”。它并没有真正解释什么是错误的,或者是什么改变来修复它。

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 2022-11-09
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2013-08-08
      相关资源
      最近更新 更多