【问题标题】:Spring-Maven Project: Unsupported major.minor version 52.0 stubborn errorSpring-Maven 项目:不支持的major.minor 版本52.0 顽固错误
【发布时间】:2018-03-22 20:50:09
【问题描述】:

出于基础架构的原因,我正在将一个小型应用程序从 Tomcat 8/JRE 1.8 降级到 Tomcat 7/JRE 1.7。然而,当我将 JRE 设置为 1.7 并将编译器合规级别设置为 1.7 时,我在 Tomcat 7 启动时遇到了这个错误。 我已经尝试了所有方法 question,但没有成功。

  • 编译器合规级别:1.7
  • 目标运行时:Apache Tomcat v7.0
  • JRE 系统库:jdk1.7.0_80

Maven POM sn-p:

  <properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

任何帮助都是值得的。谢谢。

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/compoT7]]
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:188)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1119)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:819)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/compoT7]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
    ... 6 more
Caused by: java.lang.UnsupportedClassVersionError: org/springframework/web/SpringServletContainerInitializer : Unsupported major.minor version 52.0 (unable to load class org.springframework.web.SpringServletContainerInitializer)
    at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:3209)
    at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:1373)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1861)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:278)
    at org.apache.catalina.startup.WebappServiceLoader.loadServices(WebappServiceLoader.java:197)
    at org.apache.catalina.startup.WebappServiceLoader.load(WebappServiceLoader.java:158)
    at org.apache.catalina.startup.ContextConfig.processServletContainerInitializers(ContextConfig.java:1579)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1280)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:888)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:388)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5522)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    ... 6 more

【问题讨论】:

  • 所见之处,答案都围绕着不断变化的 JRE 和编译器合规性级别。然而,这似乎是一些不同且更棘手的事情。
  • 您使用哪个 Spring Boot/Spring 版本?
  • spring (webmvc, jdbc,orm,data-jpa) 5.0.2.RELEASE
  • 所以 Spring 5.X 是 JDK 8 的要求,这是你的问题。见projects.spring.io/spring-framework如果你想用JDK 7运行你必须降级到Spring 4.X....

标签: java spring eclipse maven tomcat


【解决方案1】:

原因:java.lang.UnsupportedClassVersionError: org/springframework/web/SpringServletContainerInitializer : Unsupported major.minor version 52.0(无法加载类 org.springframework.web.SpringServletContainerInitializer)

您使用的 Spring 版本似乎是在 Java 8 上编译的。查看您的 Spring 版本并检查 JRE 级别。您可能必须降级 Spring。

【讨论】:

    【解决方案2】:

    很简单:

    org.springframework.web.SpringServletContainerInitializer 来自 Spring 依赖项的类是使用 1.8 JDK 编译的。您只能做的一件事就是将 Spring 依赖项降级到使用 1.7 JDK 编译的版本。

    如果您在其中一个 pom.xml 中定义了它们,只需降级它们的版本即可。

    如果是传递依赖,则降级使用较小 Spring 版本的主要依赖

    或排除 1.8 编译的依赖项并显式添加较低版本。

    【讨论】:

      【解决方案3】:

      您可以使用 Enforcer 插件来识别使用错误版本编译的库。它会准确地告诉你是哪个 jar(s) 以及它们是为什么版本编译的。

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>specifyLatestVersionHere</version>
        <executions>
          <execution>
            <id>jdk-check</id>
            <phase>validate</phase>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <enforceBytecodeVersion>
                  <maxJdkVersion>1.7</maxJdkVersion>
                </enforceBytecodeVersion>
              </rules>
              <fail>true</fail>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>extra-enforcer-rules</artifactId>
            <version>1.0-beta-6</version>
          </dependency>
        </dependencies>
      </plugin>
      

      【讨论】:

        猜你喜欢
        • 2016-01-15
        • 1970-01-01
        • 2018-10-14
        • 2018-08-24
        • 1970-01-01
        • 2015-08-25
        • 2016-08-28
        • 2017-10-20
        • 2017-01-23
        相关资源
        最近更新 更多