gpt4 book ai didi

java - Maven 中的ProcessingEnvironment 类加载器存在问题

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:52 25 4
gpt4 key购买 nike

我是 Maven 新手,几乎不处理类加载器的概念。在做一个项目时,我遇到了这个问题。我有一个代码生成器,它使用 Java 编译器 API 将类修改为某种方式 (JavaBean)。我的问题是,当我从 Eclipse 运行它时,它运行得很好,但是当我从 Maven 运行它时,它会出现一些错误。它说无法从 com.sun.source.util.Trees com.sun.tools.javac.api.JavacTrees 进行转换

我认为问题在于 ClassLoader 中的不一致,因为我在屏幕上打印了 Eclipse 中的 ClassLoader: 的值是正确的,但是当我在 Maven 中运行时,更改了ProcessingEnvironment 的 ClassLoader

这是我编写注释处理器的地方。错误就在我将processingEnv实例化为树的行上。

尝试强制 ClassLoaderprocessingEnv 与树 (com.sun.source.util.Trees) 相同,但在 Maven 中不起作用

public class AnnotationProcessor extends AbstractProcessor {

private Trees trees;
@Override
public void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);

System.out.println("getClass().getClassLoader(): "
+ getClass().getClassLoader().toString());
System.out.println("Trees.class.getClassLoader(): "
+ Trees.class.getClassLoader().toString());
System.out.println("processingEnv.getClass().getClassLoader() 1: "
+ processingEnv.getClass().getClassLoader().toString());

try {
processingEnv.getClass().getClassLoader()
.loadClass("com.sun.source.util.Trees");
trees = Trees.instance(processingEnv);

System.out.println("processingEnv.getClass().getClassLoader() 2: "
+ processingEnv.getClass().getClassLoader().toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

我在控制台中收到的部分错误是:

getClass().getClassLoader(): ClassRealm[plugin>com.minotauro:CledaPropMaven:0.0.1-SNAPSHOT, parent: sun.misc.Launcher$AppClassLoader@60396ed8]
Trees.class.getClassLoader(): ClassRealm[plugin>com.minotauro:CledaPropMaven:0.0.1-SNAPSHOT, parent: sun.misc.Launcher$AppClassLoader@60396ed8]
processingEnv.getClass().getClassLoader() 1: java.net.FactoryURLClassLoader@554f686d
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.179s
[INFO] Finished at: Sun Aug 03 19:31:27 VET 2014
[INFO] Final Memory: 10M/98M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.minotauro:CledaPropMaven:0.0.1-SNAPSHOT:propDesc (default-cli) on project CledaMavenTest: Execution default-cli of goal com.minotauro:CledaPropMaven:0.0.1-SNAPSHOT:propDesc failed: java.lang.AssertionError: java.lang.ClassCastException: com.sun.tools.javac.api.JavacTrees cannot be cast to com.sun.source.util.Trees -> [Help 1]

拜托!我需要帮助!谢谢你!谢谢!

最佳答案

对我来说,问题与使用 JDK 的 ToolProvider 有关。获取 JavaCompiler 的实例。 ToolProvider 最终使用不同的类加载器来加载 com.sun.tools.javac.api.JavacTool 类。

对我有用的解决方案(至少到目前为止)是使用 getSystemJavaCompiler 方法来提供 JavaCompiler 实例:

  JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

我刚刚使用 JavacTool.create() 创建了一个编译器:

  JavaCompiler compiler = JavacTool.create();

当然,这会将您与特定的实现联系起来,但(就我个人而言)我现在愿意接受这一点。

关于java - Maven 中的ProcessingEnvironment 类加载器存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25110407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com