classloader-rt.jar

本文介绍Java中类加载器的工作原理,包括Bootstrap、Extension和AppClassLoader的功能及层级关系,以及自定义类加载器的方法。

 Java应用环境中不同的class分别由不同的ClassLoader负责加载。JVM提供了三个默认的ClassLoader:Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader, 其中Bootstrap ClassLoader是JVM级别的,由C++编写,Extension ClassLoader、App ClassLoader都是Java类,继承自URLClassLoader超类。Bootstrap ClassLoader由JVM启动,然后初始化sun.misc.Launcher, sun.misc.Launcher初始化Extension ClassLoader和App ClassLoader。 
  三个默认ClassLoader关系为:Bootstrap ClassLoader是Extension ClassLoader的parent,Extension ClassLoader是App ClassLoader的parent,但这并不是继承关系,只是语意上的定义,基本上每一个ClassLoader实现,都有一个Parent ClassLoader,可通过getParent()方法获取当前ClassLoader的parent。Bootstrap ClassLoader比较特殊,因为它不是Java class,所以Extension ClassLoader的getParent()方法返回NULL。如下:

public class Test {

    public static void main(String [] args) {

        ClassLoader cl = Test.class.getClassLoader();

        while (cl != null) {
            System.out.println(cl + "'s parent ClassLoader is " + cl.getParent());
            cl = cl.getParent();
        }
    }

}

返回结果:
sun.misc.Launcher$AppClassLoader@18b4aac2's parent ClassLoader is sun.misc.Launcher$ExtClassLoader@4617c264
sun.misc.Launcher$ExtClassLoader@4617c264's parent ClassLoader is null
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1. Bootstrap ClassLoader 
      Bootstrap ClassLoader称为启动类加载器,是Java类加载层次中最顶级的加载,负责加载JDK中的核心类库,如:rt.jar、resource.jar、charsets.jar等,Bootstrap类加载器的加载目录由系统属性(sun.boot.class.path)指定,目录如下:

    public class Test {
    
        public static void main(String [] args) {
    
            // 也可通过 System.getProperty("sun.boot.class.path" 获取
            URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
            for (int i = 0; i < urls.length; i++) {
                System.out.println(urls[i].toExternalForm());
            }
    
        }
    
    }
    
    本机JDK环境返回结果:
    file:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/resources.jar
    file:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/rt.jar
    file:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/sunrsasign.jar
    file:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/jsse.jar
    file:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/jce.jar
    file:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/charsets.jar
    file:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/jfr.jar
    file:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/classes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 2. Extension ClassLoader 
      Extension ClassLoader称为扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext目录下的所有文件。Extension ClassLoader是JVM启动类(sun.misc.Launcher)的内部类,继承自java.net.URLClassLoader类。其加载目录由系统属性(java.ext.dirs)指定。本机加载目录如下:

    public class Test {
    
        public static void main(String [] args) {
    
    
            String paths = System.getProperty("java.ext.dirs");
    
            String [] pathList = paths.split(File.pathSeparator);
    
            for(String path : pathList) {
                System.out.println(path);
            }
        }
    
    }
    
    本机返回结果:
    /Users/Jerry/Library/Java/Extensions
    /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/ext
    /Library/Java/Extensions
    /Network/Library/Java/Extensions
    /System/Library/Java/Extensions
    /usr/lib/java
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 3.App ClassLoader 
      App ClassLoader称为系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件。App ClassLoader既是加载系统属性(java.class.path)的类加载器,加载目录如下:

    package test;
    
    import java.io.File;
    
    public class Test {
    
        public static void main(String [] args) {
    
    
            String paths = System.getProperty("java.class.path");
    
            String [] pathList = paths.split(File.pathSeparator);
    
            for(String path : pathList) {
                System.out.println(path);
            }
        }
    
    }
    
    本机命令行编译并执行:java -cp /Users/Jerry/documents:/Users/Jerry/documents/workspace/xf-test test.Test
    
    返回结果:
    /Users/Jerry/documents
    /Users/Jerry/documents/workspace/xf-test
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

      如果不指定classpath,本地执行返回当前目录(”.”),如果通过IDE执行,则会返回IDE设定的classpath值

  • 4.自定义ClassLoader 
      除了Java默认提供的三种ClassLoader外,用户也可以根据自己需要,通过继承ClassLoader超类定义属于自己的ClassLoader。范例如下: 
     定义自己的ClassLoader类,当通过ClassLoader.loadClass()方法加载类时,如果加载不到对应的类,则会调用自定义ClassLoader的findClass方法继续加载类,详见下一节:

    public class MyClassLoader extends ClassLoader{
    
        public static final String driver = "/Users/Jerry/Desktop/";
        public static final String fileTyep = ".class";
    
        public Class findClass(String name) {
            byte[] data = loadClassData(name);
            return defineClass(data, 0, data.length);
        }
    
        public byte[] loadClassData(String name) {
            FileInputStream fis = null;
            byte[] data = null;
            try {
                File file = new File(driver + name + fileTyep);
                System.out.println(file.getAbsolutePath());
                fis = new FileInputStream(file);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int ch = 0;
                while ((ch = fis.read()) != -1) {
                    baos.write(ch);
                }
                data = baos.toByteArray();
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("loadClassData-IOException");
            }
            return data;
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    编写测试类,编译,并将class文件移动到在MyClassLoade的driver目录下:

    package test;
    
    public class Test {
    
        public void sayHello(String name) {
            System.out.println("hello " + name);
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试MyClassLoader:

    public class Test {
    
        public static void main(String[] args) {
            MyClassLoader cl1 = new MyClassLoader();
            try {
                Class c1 = cl1.findClass("Test");  // 或调用:Class c1 = cl1.loadClass("Test");
                Object object = c1.newInstance();
                Method method = c1.getMethod("sayHello", String.class);
                method.invoke(object, "Jerry");
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    
    }  
    
    返回结果:
    /Users/Jerry/Desktop/Test.class
    hello Jerry
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 5.双亲委托模型 
      ClassLoader使用双亲委托模型来搜索类,当一个ClassLoader实例需要加载某个类时,它会检查是否已经加载过该类,如果没有加载过会把该任务委托给它的父类加载器,逐级向上检查是否已经加载过这个类。如果该类各级都未加载过,则自上而下尝试加载该类,任何一级加载到该类则返回,最终未加载到该类则返回ClassNotFoundException异常。 
      ClassLoader loadClass()方法原码如下,类加载大致过程为: 
      [1] 当前加载器检查类是否已被加载,如果已被加载则返回,否则交由父加载器加载 
      [2] 如果父加载器不为空,则由父加载加载,如果父加载器为空,则交由Bootstrap 加载器加载 
      [3] 如果父加载器加载失败,则尝试通过findClass()方法亲自加载类

    protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException
        {
            synchronized (getClassLoadingLock(name)) {
                // [1] 检查类是否已被加载
                Class<?> c = findLoadedClass(name);
                if (c == null) {
                    long t0 = System.nanoTime();
                    try {
                        if (parent != null) {
                            // [2] 如果父加载器不为空,则交由父类加载
                            c = parent.loadClass(name, false);
                        } else {
                            //  [3] 如果父类加载器为空,则交由Bootstrap ClassLoader加载
                            c = findBootstrapClassOrNull(name);
                        }
                    } catch (ClassNotFoundException e) {
    
                    }
    
                    if (c == null) {
                        // [4] 如果委托的父加载器未加载到类,则尝试亲自加载类
                        long t1 = System.nanoTime();
                        c = findClass(name);
                        sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                        sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                        sun.misc.PerfCounter.getFindClasses().increment();
                    }
                }
                if (resolve) {
                    resolveClass(c);
                }
                return c;
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    ClassLoader体系结构如下: 
    这里写图片描述

/Users/cruelsummer/Library/Java/JavaVirtualMachines/azul-17.0.16/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:60854,suspend=y,server=n -javaagent:/Users/cruelsummer/Library/Caches/JetBrains/IntelliJIdea2025.2/captureAgent/debugger-agent.jar=file:///var/folders/vh/xl6658gx77v4x54y37lh3qwh0000gn/T/capture9503145822115811672.props -javaagent:/Users/cruelsummer/.m2/repository/org/aspectj/aspectjweaver/1.9.24/aspectjweaver-1.9.24.jar -agentpath:/private/var/folders/vh/xl6658gx77v4x54y37lh3qwh0000gn/T/idea_libasyncProfiler_dylib_temp_folder/libasyncProfiler.dylib=version,jfr,event=wall,interval=10ms,cstack=no,file=/Users/cruelsummer/IdeaSnapshots/AspectjdemoApplication_2025_10_22_150648.jfr,log=/private/var/folders/vh/xl6658gx77v4x54y37lh3qwh0000gn/T/AspectjdemoApplication_2025_10_22_150648.jfr.log.txt,logLevel=DEBUG -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dmanagement.endpoints.jmx.exposure.include=* -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Ddebugger.agent.enable.coroutines=true -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -Dfile.encoding=UTF-8 -classpath /Users/cruelsummer/Projects/JavaPros/aspectjdemo/target/classes:/Users/cruelsummer/.m2/repository/org/springframework/boot/spring-boot-starter-web/3.4.10/spring-boot-starter-web-3.4.10.jar:/Users/cruelsummer/.m2/repository/org/springframework/boot/spring-boot-starter/3.4.10/spring-boot-starter-3.4.10.jar:/Users/cruelsummer/.m2/repository/org/springframework/boot/spring-boot/3.4.10/spring-boot-3.4.10.jar:/Users/cruelsummer/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/3.4.10/spring-boot-autoconfigure-3.4.10.jar:/Users/cruelsummer/.m2/repository/org/springframework/boot/spring-boot-starter-logging/3.4.10/spring-boot-starter-logging-3.4.10.jar:/Users/cruelsummer/.m2/repository/ch/qos/logback/logback-classic/1.5.18/logback-classic-1.5.18.jar:/Users/cruelsummer/.m2/repository/ch/qos/logback/logback-core/1.5.18/logback-core-1.5.18.jar:/Users/cruelsummer/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.24.3/log4j-to-slf4j-2.24.3.jar:/Users/cruelsummer/.m2/repository/org/apache/logging/log4j/log4j-api/2.24.3/log4j-api-2.24.3.jar:/Users/cruelsummer/.m2/repository/org/slf4j/jul-to-slf4j/2.0.17/jul-to-slf4j-2.0.17.jar:/Users/cruelsummer/.m2/repository/jakarta/annotation/jakarta.annotation-api/2.1.1/jakarta.annotation-api-2.1.1.jar:/Users/cruelsummer/.m2/repository/org/yaml/snakeyaml/2.3/snakeyaml-2.3.jar:/Users/cruelsummer/.m2/repository/org/springframework/boot/spring-boot-starter-json/3.4.10/spring-boot-starter-json-3.4.10.jar:/Users/cruelsummer/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.18.4/jackson-databind-2.18.4.jar:/Users/cruelsummer/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.18.4/jackson-annotations-2.18.4.jar:/Users/cruelsummer/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.18.4.1/jackson-core-2.18.4.1.jar:/Users/cruelsummer/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.18.4/jackson-datatype-jdk8-2.18.4.jar:/Users/cruelsummer/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.18.4/jackson-datatype-jsr310-2.18.4.jar:/Users/cruelsummer/.m2/repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.18.4/jackson-module-parameter-names-2.18.4.jar:/Users/cruelsummer/.m2/repository/org/springframework/boot/spring-boot-starter-tomcat/3.4.10/spring-boot-starter-tomcat-3.4.10.jar:/Users/cruelsummer/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/10.1.46/tomcat-embed-core-10.1.46.jar:/Users/cruelsummer/.m2/repository/org/apache/tomcat/embed/tomcat-embed-el/10.1.46/tomcat-embed-el-10.1.46.jar:/Users/cruelsummer/.m2/repository/org/apache/tomcat/embed/tomcat-embed-websocket/10.1.46/tomcat-embed-websocket-10.1.46.jar:/Users/cruelsummer/.m2/repository/org/springframework/spring-web/6.2.11/spring-web-6.2.11.jar:/Users/cruelsummer/.m2/repository/org/springframework/spring-beans/6.2.11/spring-beans-6.2.11.jar:/Users/cruelsummer/.m2/repository/io/micrometer/micrometer-observation/1.14.11/micrometer-observation-1.14.11.jar:/Users/cruelsummer/.m2/repository/io/micrometer/micrometer-commons/1.14.11/micrometer-commons-1.14.11.jar:/Users/cruelsummer/.m2/repository/org/springframework/spring-webmvc/6.2.11/spring-webmvc-6.2.11.jar:/Users/cruelsummer/.m2/repository/org/springframework/spring-context/6.2.11/spring-context-6.2.11.jar:/Users/cruelsummer/.m2/repository/org/springframework/spring-expression/6.2.11/spring-expression-6.2.11.jar:/Users/cruelsummer/.m2/repository/org/slf4j/slf4j-api/2.0.17/slf4j-api-2.0.17.jar:/Users/cruelsummer/.m2/repository/org/springframework/spring-core/6.2.11/spring-core-6.2.11.jar:/Users/cruelsummer/.m2/repository/org/springframework/spring-jcl/6.2.11/spring-jcl-6.2.11.jar:/Users/cruelsummer/.m2/repository/org/springframework/boot/spring-boot-starter-aop/3.4.10/spring-boot-starter-aop-3.4.10.jar:/Users/cruelsummer/.m2/repository/org/springframework/spring-aop/6.2.11/spring-aop-6.2.11.jar:/Users/cruelsummer/.m2/repository/org/aspectj/aspectjweaver/1.9.24/aspectjweaver-1.9.24.jar:/Users/cruelsummer/Applications/IntelliJ IDEA Ultimate.app/Contents/lib/idea_rt.jar com.example.aspectjdemo.AspectjdemoApplication Connected to the target VM, address: '127.0.0.1:60854', transport: 'socket' [AppClassLoader@1dbd16a6] info AspectJ Weaver Version 1.9.24 built on Thursday Apr 10, 2025 at 13:19:24 PDT [AppClassLoader@1dbd16a6] info register classloader jdk.internal.loader.ClassLoaders$AppClassLoader@1dbd16a6 [AppClassLoader@1dbd16a6] info using configuration /Users/cruelsummer/Projects/JavaPros/aspectjdemo/target/classes/META-INF/aop.xml [AppClassLoader@1dbd16a6] info register aspect com.example.aspectjdemo.aspect.MyAspect . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.4.10) 2025-10-22T15:06:50.413+08:00 INFO 62657 --- [aspectjdemo] [ main] c.e.aspectjdemo.AspectjdemoApplication : Starting AspectjdemoApplication using Java 17.0.16 with PID 62657 (/Users/cruelsummer/Projects/JavaPros/aspectjdemo/target/classes started by cruelsummer in /Users/cruelsummer/Projects/JavaPros/aspectjdemo) 2025-10-22T15:06:50.415+08:00 INFO 62657 --- [aspectjdemo] [ main] c.e.aspectjdemo.AspectjdemoApplication : No active profile set, falling back to 1 default profile: "default" 2025-10-22T15:06:50.994+08:00 INFO 62657 --- [aspectjdemo] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) 2025-10-22T15:06:51.000+08:00 INFO 62657 --- [aspectjdemo] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2025-10-22T15:06:51.000+08:00 INFO 62657 --- [aspectjdemo] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.46] 2025-10-22T15:06:51.017+08:00 INFO 62657 --- [aspectjdemo] [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2025-10-22T15:06:51.017+08:00 INFO 62657 --- [aspectjdemo] [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 583 ms 2025-10-22T15:06:51.090+08:00 WARN 62657 --- [aspectjdemo] [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loadTimeWeaver' defined in org.springframework.context.annotation.LoadTimeWeavingConfiguration: Failed to instantiate [org.springframework.instrument.classloading.LoadTimeWeaver]: Factory method 'loadTimeWeaver' threw exception with message: ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:spring-instrument-{version}.jar 2025-10-22T15:06:51.091+08:00 INFO 62657 --- [aspectjdemo] [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2025-10-22T15:06:51.098+08:00 INFO 62657 --- [aspectjdemo] [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. [TomcatEmbeddedWebappClassLoader@45c9b3] info AspectJ Weaver Version 1.9.24 built on Thursday Apr 10, 2025 at 13:19:24 PDT [TomcatEmbeddedWebappClassLoader@45c9b3] info register classloader org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@45c9b3 [TomcatEmbeddedWebappClassLoader@45c9b3] info using configuration /Users/cruelsummer/Projects/JavaPros/aspectjdemo/target/classes/META-INF/aop.xml [TomcatEmbeddedWebappClassLoader@45c9b3] info register aspect com.example.aspectjdemo.aspect.MyAspect 2025-10-22T15:06:51.104+08:00 ERROR 62657 --- [aspectjdemo] [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loadTimeWeaver' defined in org.springframework.context.annotation.LoadTimeWeavingConfiguration: Failed to instantiate [org.springframework.instrument.classloading.LoadTimeWeaver]: Factory method 'loadTimeWeaver' threw exception with message: ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:spring-instrument-{version}.jar at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:489) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1375) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1205) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1221) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1187) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1123) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) ~[spring-context-6.2.11.jar:6.2.11] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.11.jar:6.2.11] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.4.10.jar:3.4.10] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.4.10.jar:3.4.10] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.4.10.jar:3.4.10] at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.4.10.jar:3.4.10] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) ~[spring-boot-3.4.10.jar:3.4.10] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) ~[spring-boot-3.4.10.jar:3.4.10] at com.example.aspectjdemo.AspectjdemoApplication.main(AspectjdemoApplication.java:13) ~[classes/:na] Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.instrument.classloading.LoadTimeWeaver]: Factory method 'loadTimeWeaver' threw exception with message: ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:spring-instrument-{version}.jar at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:200) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiateWithFactoryMethod(SimpleInstantiationStrategy.java:89) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:169) ~[spring-beans-6.2.11.jar:6.2.11] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-6.2.11.jar:6.2.11] ... 21 common frames omitted Caused by: java.lang.IllegalStateException: ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:spring-instrument-{version}.jar at org.springframework.context.weaving.DefaultContextLoadTimeWeaver.setBeanClassLoader(DefaultContextLoadTimeWeaver.java:95) ~[spring-context-6.2.11.jar:6.2.11] at org.springframework.context.weaving.DefaultContextLoadTimeWeaver.<init>(DefaultContextLoadTimeWeaver.java:68) ~[spring-context-6.2.11.jar:6.2.11] at org.springframework.context.annotation.LoadTimeWeavingConfiguration.loadTimeWeaver(LoadTimeWeavingConfiguration.java:91) ~[spring-context-6.2.11.jar:6.2.11] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:172) ~[spring-beans-6.2.11.jar:6.2.11] ... 24 common frames omitted Disconnected from the target VM, address: '127.0.0.1:60854', transport: 'socket' Process finished with exit code 1
10-23
D:\JDK21\jdk-21.0.8\bin\java.exe -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:D:\ideaIU\IntelliJ IDEA 2022.2.2\lib\idea_rt.jar=60305:D:\ideaIU\IntelliJ IDEA 2022.2.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\ssm0u4hl\target\classes;D:\maven\maven-repository\org\springframework\spring-core\5.0.0.RELEASE\spring-core-5.0.0.RELEASE.jar;D:\maven\maven-repository\org\springframework\spring-jcl\5.3.31\spring-jcl-5.3.31.jar;D:\maven\maven-repository\org\springframework\spring-context\5.0.0.RELEASE\spring-context-5.0.0.RELEASE.jar;D:\maven\maven-repository\org\springframework\spring-expression\5.3.31\spring-expression-5.3.31.jar;D:\maven\maven-repository\org\springframework\spring-context-support\5.0.0.RELEASE\spring-context-support-5.0.0.RELEASE.jar;D:\maven\maven-repository\org\springframework\spring-tx\5.0.0.RELEASE\spring-tx-5.0.0.RELEASE.jar;D:\maven\maven-repository\org\springframework\spring-aop\5.0.0.RELEASE\spring-aop-5.0.0.RELEASE.jar;D:\maven\maven-repository\org\springframework\spring-beans\5.0.0.RELEASE\spring-beans-5.0.0.RELEASE.jar;D:\maven\maven-repository\org\springframework\spring-jdbc\5.0.0.RELEASE\spring-jdbc-5.0.0.RELEASE.jar;D:\maven\maven-repository\org\springframework\spring-web\5.0.0.RELEASE\spring-web-5.0.0.RELEASE.jar;D:\maven\maven-repository\org\springframework\spring-webmvc\5.0.0.RELEASE\spring-webmvc-5.0.0.RELEASE.jar;D:\maven\maven-repository\org\aspectj\aspectjweaver\1.8.8\aspectjweaver-1.8.8.jar;D:\maven\maven-repository\commons-fileupload\commons-fileupload\1.3.1\commons-fileupload-1.3.1.jar;D:\maven\maven-repository\javax\servlet\jstl\1.2\jstl-1.2.jar;D:\maven\maven-repository\com\baomidou\mybatis-plus\2.3\mybatis-plus-2.3.jar;D:\maven\maven-repository\com\baomidou\mybatis-plus-support\2.3\mybatis-plus-support-2.3.jar;D:\maven\maven-repository\com\baomidou\mybatis-plus-core\2.3\mybatis-plus-core-2.3.jar;D:\maven\maven-repository\com\github\jsqlparser\jsqlparser\1.1\jsqlparser-1.1.jar;D:\maven\maven-repository\org\mybatis\mybatis-spring\1.3.2\mybatis-spring-1.3.2.jar;D:\maven\maven-repository\org\mybatis\mybatis\3.4.6\mybatis-3.4.6.jar;D:\maven\maven-repository\com\baomidou\mybatis-plus-generate\2.3\mybatis-plus-generate-2.3.jar;D:\maven\maven-repository\com\mysql\mysql-connector-j\8.0.31\mysql-connector-j-8.0.31.jar;D:\maven\maven-repository\com\microsoft\sqlserver\mssql-jdbc\6.2.0.jre8\mssql-jdbc-6.2.0.jre8.jar;D:\maven\maven-repository\com\alibaba\druid\1.1.0\druid-1.1.0.jar;D:\maven\maven-repository\com\alibaba\fastjson\1.2.8\fastjson-1.2.8.jar;D:\maven\maven-repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\maven\maven-repository\org\slf4j\slf4j-api\1.7.19\slf4j-api-1.7.19.jar;D:\maven\maven-repository\org\slf4j\slf4j-log4j12\1.7.19\slf4j-log4j12-1.7.19.jar;D:\maven\maven-repository\org\springframework\spring-test\5.0.0.RELEASE\spring-test-5.0.0.RELEASE.jar;D:\maven\maven-repository\org\apache\commons\commons-lang3\3.0\commons-lang3-3.0.jar;D:\maven\maven-repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;D:\maven\maven-repository\commons-io\commons-io\2.5\commons-io-2.5.jar;D:\maven\maven-repository\cn\hutool\hutool-all\4.0.12\hutool-all-4.0.12.jar;D:\maven\maven-repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.29\tomcat-embed-core-9.0.29.jar;D:\maven\maven-repository\org\apache\tomcat\tomcat-annotations-api\9.0.83\tomcat-annotations-api-9.0.83.jar;D:\maven\maven-repository\commons-beanutils\commons-beanutils\1.8.0\commons-beanutils-1.8.0.jar;D:\maven\maven-repository\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;D:\maven\maven-repository\com\baidu\aip\java-sdk\4.4.1\java-sdk-4.4.1.jar;D:\maven\maven-repository\org\json\json\20160810\json-20160810.jar;D:\maven\maven-repository\com\fasterxml\jackson\core\jackson-annotations\2.10.1\jackson-annotations-2.10.1.jar;D:\maven\maven-repository\com\fasterxml\jackson\core\jackson-databind\2.10.1\jackson-databind-2.10.1.jar;D:\maven\maven-repository\com\fasterxml\jackson\core\jackson-core\2.13.5\jackson-core-2.13.5.jar;D:\maven\maven-repository\org\codehaus\jackson\jackson-mapper-asl\1.9.13\jackson-mapper-asl-1.9.13.jar;D:\maven\maven-repository\org\codehaus\jackson\jackson-core-asl\1.9.13\jackson-core-asl-1.9.13.jar;D:\maven\maven-repository\org\apache\poi\poi\3.11\poi-3.11.jar;D:\maven\maven-repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;D:\maven\maven-repository\org\apache\poi\poi-ooxml\3.9\poi-ooxml-3.9.jar;D:\maven\maven-repository\org\apache\poi\poi-ooxml-schemas\3.9\poi-ooxml-schemas-3.9.jar;D:\maven\maven-repository\org\apache\xmlbeans\xmlbeans\2.3.0\xmlbeans-2.3.0.jar;D:\maven\maven-repository\stax\stax-api\1.0.1\stax-api-1.0.1.jar;D:\maven\maven-repository\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;D:\maven\maven-repository\xml-apis\xml-apis\1.0.b2\xml-apis-1.0.b2.jar;D:\maven\maven-repository\com\alipay\sdk\alipay-sdk-java\4.39.132.ALL\alipay-sdk-java-4.39.132.ALL.jar;D:\maven\maven-repository\org\bouncycastle\bcprov-jdk15on\1.62\bcprov-jdk15on-1.62.jar;D:\maven\maven-repository\com\squareup\okhttp3\okhttp\4.9.3\okhttp-4.9.3.jar;D:\maven\maven-repository\com\squareup\okio\okio\2.8.0\okio-2.8.0.jar;D:\maven\maven-repository\org\jetbrains\kotlin\kotlin-stdlib-common\1.6.21\kotlin-stdlib-common-1.6.21.jar;D:\maven\maven-repository\org\jetbrains\kotlin\kotlin-stdlib\1.6.21\kotlin-stdlib-1.6.21.jar;D:\maven\maven-repository\org\jetbrains\annotations\13.0\annotations-13.0.jar;D:\maven\maven-repository\org\projectlombok\lombok\1.18.30\lombok-1.18.30.jar;D:\maven\maven-repository\org\springframework\boot\spring-boot\3.5.5\spring-boot-3.5.5.jar;D:\maven\maven-repository\org\springframework\boot\spring-boot-autoconfigure\3.5.5\spring-boot-autoconfigure-3.5.5.jar com.example.AlipayApplication Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:242) at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:257) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) at com.example.AlipayApplication.main(AlipayApplication.java:8) Caused by: java.lang.ClassNotFoundException: org.springframework.core.metrics.ApplicationStartup at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ... 5 more运行出现这个错误怎么办
最新发布
11-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值