1. 程式人生 > 其它 >Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file

Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file

發生緣由

  • 學習SpringMVC

執行環境

  • jdk版本:jdk-16.0.2

  • Idea版本:2021.2

  • 電腦系統:win10

環境搭建

  1. 建立Maven專案。點選Maven專案建立時候的create from archetype,選擇Maven裡面的模板即可,選擇org.apache.maven.archetypes:maven-archetype-webapp

  2. 因為建立的目錄結構不全,所以我們需要手動補全java資料夾。點選file-->Project Structure-->Moudles,在Moudles中選擇剛剛建立的專案,看看src資料夾下面的main資料夾下面是否存在java資料夾。

    如果沒有則需要手動新增:右鍵main資料夾,選擇new folder,在出現的方框中輸入java。就會建立一個java資料夾。

  3. 將pom.xml中多餘的內容刪除掉,再新增SpringMVC需要的依賴。在pom.xml檔案中新增SpringMVC所需要的jar包以及Tomcat執行所需要的外掛,最後pom.xml檔案內容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    ​
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    ​
      <groupId>com.linxuan</groupId>
      <artifactId>springmvc01</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    ​
      <dependencies>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.2.10.RELEASE</version>
        </dependency>
      </dependencies>
      
      <build>
        <plugins>
          <!--用來快速部署並啟動Maven專案,tomcat7-maven-plugin是maven中整合tomcat容器的一個外掛-->
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
              <port>80</port>
              <path>/</path>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
  4. 建立配置類

    package com.linxuan.config;
    ​
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    ​
    @Configuration
    @ComponentScan("com.linxuan.controller")
    public class SpringMvcConfig {
    }
  5. 建立Controller類

    package com.linxuan.controller;
    ​
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    ​
    @Controller
    public class UserController {
    ​
        @RequestMapping("/save")
        // 設定返回資料為json
        @ResponseBody
        public String save() {
            System.out.println("user save...");
            return "{'info':'springmvc'}";
        }
    }
  6. 使用配置類替換web.xml。將web.xml刪除,換成ServletContainersInitConfig

    package com.linxuan.config;
    ​
    import org.springframework.web.context.WebApplicationContext;
    import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
    import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
    ​
    public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
        //載入springmvc配置類
        protected WebApplicationContext createServletApplicationContext() {
            //初始化WebApplicationContext物件
            AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
            //載入指定配置類
            ctx.register(SpringMvcConfig.class);
            return ctx;
        }
    ​
        //設定由springmvc控制器處理的請求對映路徑
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    ​
        //載入spring配置類
        protected WebApplicationContext createRootApplicationContext() {
            return null;
        }
    }
  7. 配置Tomcat

  8. 執行發現報錯

    org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [D:\Java\IdeaProjects\ssm\springmvc01\target\classes\com\linxuan\controller\UserController.class]; nested exception is org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [D:\Java\IdeaProjects\ssm\springmvc01\target\classes\com\linxuan\controller\UserController.class]; nested exception is java.lang.IllegalArgumentException: Unsupported class file major version 60
        at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:452)
        at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:315)
        at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276)
        at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:132)
        at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:296)
        at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:250)
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:207)
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:175)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:319)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96)
        at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:707)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:533)
        at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:702)
        at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:578)
        at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:530)
        at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:170)
        at javax.servlet.GenericServlet.init(GenericServlet.java:160)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1280)
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1091)
        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5033)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5317)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
        at java.base/java.lang.Thread.run(Thread.java:831)
    Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [D:\Java\IdeaProjects\ssm\springmvc01\target\classes\com\linxuan\controller\UserController.class]; nested exception is java.lang.IllegalArgumentException: Unsupported class file major version 60
        at org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:60)
        at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:49)
        at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103)
        at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:123)
        at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:429)
        ... 29 more
    Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 60
        at org.springframework.asm.ClassReader.<init>(ClassReader.java:196)
        at org.springframework.asm.ClassReader.<init>(ClassReader.java:177)
        at org.springframework.asm.ClassReader.<init>(ClassReader.java:163)
        at org.springframework.asm.ClassReader.<init>(ClassReader.java:284)
        at org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:57)
        ... 33 more
    ​
    5月 16, 2022 10:53:41 下午 org.apache.catalina.core.StandardContext loadOnStartup
    嚴重: Servlet  threw load() exception
    java.lang.IllegalArgumentException: Unsupported class file major version 60
        at org.springframework.asm.ClassReader.<init>(ClassReader.java:196)
        at org.springframework.asm.ClassReader.<init>(ClassReader.java:177)
        at org.springframework.asm.ClassReader.<init>(ClassReader.java:163)
        at org.springframework.asm.ClassReader.<init>(ClassReader.java:284)
        at org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:57)
        at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:49)
        at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103)
        at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:123)
        at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:429)
        at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:315)
        at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276)
        at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:132)
        at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:296)
        at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:250)
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:207)
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:175)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:319)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96)
        at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:707)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:533)
        at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:702)
        at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:578)
        at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:530)
        at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:170)
        at javax.servlet.GenericServlet.init(GenericServlet.java:160)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1280)
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1091)
        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5033)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5317)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
        at java.base/java.lang.Thread.run(Thread.java:831)
    ​
    5月 16, 2022 10:53:41 下午 org.apache.coyote.AbstractProtocol start
    資訊: Starting ProtocolHandler ["http-bio-80"]
    ERROR: IllegalAccessException for stop method in class org.apache.tomcat.maven.plugin.tomcat7.run.ExtendedTomcat
    java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at org.apache.tomcat.maven.common.run.EmbeddedRegistry.shutdownAll(EmbeddedRegistry.java:110)
        at org.apache.tomcat.maven.common.run.EmbeddedRegistry$1.run(EmbeddedRegistry.java:69)
    Caused by: org.apache.catalina.LifecycleException: Failed to stop component [StandardServer[-1]]
        at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:236)
        at org.apache.catalina.startup.Tomcat.stop(Tomcat.java:345)
        ... 6 more
    Caused by: org.apache.catalina.LifecycleException: Failed to stop component [StandardService[Tomcat]]
        at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:236)
        at org.apache.catalina.core.StandardServer.stopInternal(StandardServer.java:753)
        at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
        ... 7 more
    Caused by: org.apache.catalina.LifecycleException: Failed to stop component [StandardEngine[Tomcat]]
        at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:236)
        at org.apache.catalina.core.StandardService.stopInternal(StandardService.java:502)
        at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
        ... 9 more
    Caused by: org.apache.catalina.LifecycleException: A child container failed during stop
        at org.apache.catalina.core.ContainerBase.stopInternal(ContainerBase.java:1186)
        at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
        ... 11 more
    ​
    Process finished with exit code 130

問題補救

  • 嘗試將jdk版本降至1.8,將下面程式碼加入pom.xml檔案中

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    結果:沒有任何作用,還是顯示上述報錯資訊。

  • 不用Tomcat7外掛,用電腦下載的Tomcat,我這裡電腦本地下載的Tomcat版本為8.5.75。

    現在pom.xml檔案內容如下

    <?xml version="1.0" encoding="UTF-8"?>
    ​
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    ​
      <groupId>com.linxuan</groupId>
      <artifactId>springmvc01</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    ​
      <dependencies>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.2.10.RELEASE</version>
        </dependency>
      </dependencies>
    ​
      <build>
        <!--外掛-->
        <plugins>
          <!--用來快速部署並啟動Maven專案,tomcat7-maven-plugin是maven中整合tomcat容器的一個外掛-->
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
              <port>80</port>
              <path>/</path>
            </configuration>
          </plugin>
    ​
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>
        </plugins>
      </build>
    ​
    </project>
  • 將上述的外掛註釋掉,然後使用電腦本地下載的Tomcat執行,結果發現報錯

    錯誤: 不支援發行版本 5
    ​
    Language level is invalid or missing in pom.xml. Current project JDK is 16. Specify language level in springmvc01

    檢視,果然jdk版本莫名的變成了1.5

    我們再使用外掛將jdk升至1.8,將下述內容加至pom.xml檔案中。

    <build>
        <!--外掛-->
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>
        </plugins>
    </build>
  • 再執行,依然發現報錯,報錯資訊如下

    Caused by: java.lang.IllegalArgumentException: 找到多個名為spring_web的片段。這是不合法的相對排序。

    我們匯入的spring_web jar包重複了,所以需要刪除一個

  • 再點選執行,就可以了。總的來說也就是版本不匹配的問題,多調一下版本就可以了。