前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一博 - 动态编译报错 ClassNotFoundException: com.sun.tools.javac.processing.JavacProcessingEnvironment

每日一博 - 动态编译报错 ClassNotFoundException: com.sun.tools.javac.processing.JavacProcessingEnvironment

作者头像
小小工匠
发布2024-01-06 09:54:54
2910
发布2024-01-06 09:54:54
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构
文章目录
  • Code
  • 分析
  • 修复
在这里插入图片描述
在这里插入图片描述

Code

代码语言:javascript
复制
package com.artisan.jsr269;

import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */
public class DynamicCompiler {

    public static void main(String[] args) throws Exception {

        //创建源文件
        String currentDir = System.getProperty("user.dir") + "/boot-beanUtils" ;

        // 定义一个简单的Java类,包含一个方法,该方法打印出“Hello Artisan”
        String src = "package com.artisan.jsr269 ;"
                + "public class ArtisanComplier {"
                + "    public void methodA() {"
                + "    System.out.println(\"Hello Artisan\");"
                + "}}";

        // 源文件路径和名称
        String filename = currentDir + "/src/main/java/com/artisan/jsr269/ArtisanComplier.java";
        File file = new File(filename);

        // 确保源文件所在的目录存在
        File fileParent = file.getParentFile();

        if (!fileParent.exists()) {
            fileParent.mkdir();
        }

        // 确保源文件存在
        if (!file.exists()) {
            file.createNewFile();
        }

        // 将源代码写入文件
        FileWriter fw = new FileWriter(file);
        fw.write(src);
        fw.flush();
        fw.close();

        // 使用JavaCompiler 编译java文件

        // 获取系统Java编译器
        JavaCompiler jc = ToolProvider.getSystemJavaCompiler();
        // 获取标准文件管理器
        StandardJavaFileManager fileManager = jc.getStandardFileManager(null, null, null);
        // 获取要编译的文件对象
        Iterable fileObjects = fileManager.getJavaFileObjects(filename);
        // 创建编译任务
        JavaCompiler.CompilationTask cTask   = jc.getTask(null, fileManager, null, null, null, fileObjects);
        // 执行编译任务
        cTask.call();
        // 关闭文件管理器
        fileManager.close();

        // 使用URLClassLoader加载class到内存
        URL[] urls = new URL[]{new URL("file:/" + currentDir + "/src/main/java/com/artisan/jsr269/ArtisanComplier.java")};
        URLClassLoader cLoader = new URLClassLoader(urls);
        // 加载类
        Class c = cLoader.loadClass("com.artisan.jsr269.ArtisanComplier");
        // 关闭类加载器
        cLoader.close();

        // 利用class创建实例,反射执行方法
        Object obj = c.newInstance();
        // 获取类中的方法
        Method method = c.getMethod("methodA");
        // 执行方法
        method.invoke(obj);


    }
}

运行抛出如下异常:

代码语言:javascript
复制
D:\IdeaProjects\boot2\boot-beanUtils\src\main\java\com\artisan\jsr269\ArtisanComplier.java:1: 警告: Can't initialize javac processor due to (most likely) a class loader problem: java.lang.NoClassDefFoundError: com/sun/tools/javac/processing/JavacProcessingEnvironment
package com.artisan.jsr269 ;public class ArtisanComplier {    public void methodA() {    System.out.println("Hello Artisan");}}
                                   ^
  	at lombok.javac.apt.LombokProcessor.getJavacProcessingEnvironment(LombokProcessor.java:433)
  	at lombok.javac.apt.LombokProcessor.init(LombokProcessor.java:92)
  	at lombok.core.AnnotationProcessor$JavacDescriptor.want(AnnotationProcessor.java:160)
  	at lombok.core.AnnotationProcessor.init(AnnotationProcessor.java:213)
  	at lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init(AnnotationProcessor.java:64)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.<init>(JavacProcessingEnvironment.java:500)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:597)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:690)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
  	at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
  	at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
  	at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
  	at com.sun.tools.javac.main.Main.compile(Main.java:523)
  	at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
  	at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
  	at com.artisan.jsr269.DynamicCompiler.main(DynamicCompiler.java:52)
  Caused by: java.lang.ClassNotFoundException: com.sun.tools.javac.processing.JavacProcessingEnvironment
  	at java.lang.ClassLoader.findClass(ClassLoader.java:523)
  	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
  	at lombok.launch.ShadowClassLoader.loadClass(ShadowClassLoader.java:535)
  	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
  	... 17 more
1 个警告

分析

错误 java.lang.ClassNotFoundException: com.sun.tools.javac.processing.JavacProcessingEnvironment 表示Java运行时环境无法找到名为 com.sun.tools.javac.processing.JavacProcessingEnvironment 的类。这个类是Java编译器API的一部分,它是用于访问编译器的内部处理环境的。

这个错误通常是由于以下原因之一造成的:

  1. 类路径问题:可能是因为 JavacProcessingEnvironment 类没有被包含在类路径(classpath)中。如果在使用IDE或者构建工具(如Maven或Gradle)时,确保它们包含了Java编译器API相关的库。
  2. 不正确的API使用:可能是因为你尝试使用了一个不正确的方法或者类来访问Java编译器API。检查你的代码,确保你使用了正确的方法和类。
  3. 版本不匹配:如果你使用的Java版本与编译器API的版本不匹配,也可能会导致这个错误。确保你的Java开发工具包(JDK)和编译器API的版本兼容。
  4. 内部API使用com.sun.tools.javac.processing.JavacProcessingEnvironment 是Java编译器的内部API,它不是公开的Java SE API的一部分。虽然有时候可以访问,但它可能会在不通知的情况下更改或移除。通常建议不要依赖内部API,因为它们可能在不稳定的版本中发生变化。

修复

一看属于度一类,就是 toolls中的类没找到

pom增加

代码语言:javascript
复制
  <!-- 修复  NoClassDefFoundError: com/sun/tools/javac/processing/JavacProcessingEnvironment -->
        <dependency>
            <groupId>com.sun</groupId>
            <artifactId>tools</artifactId>
            <version>1.8</version>
            <scope>system</scope>
            <systemPath>${java.home}/../lib/tools.jar</systemPath>
        </dependency>

DONE

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • Code
  • 分析
  • 修复
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档