java - 为什么我在使用某些 JRE 时会收到 UnsupportedClassVersionError : Unsupported major. 次要版本 51.0?

标签 java

SEVERE: Exception starting filter struts2
java.lang.UnsupportedClassVersionError: 
Unsupported major.minor version 51.0 (unable to load class com.directv.actions.indexAction)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2922)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1174)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1669)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
    at com.opensymphony.xwork2.util.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:139)
    at com.opensymphony.xwork2.ObjectFactory.getClassInstance(ObjectFactory.java:100)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyAction(XmlConfigurationProvider.java:366)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:329)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:429)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:239)
    at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:111)
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reload(DefaultConfiguration.java:152)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:52)
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:395)
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:452)
    at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:201)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4775)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5452)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:983)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1660)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

当我尝试在 Linux 服务器上使用 Tomcat7 启动应用程序时,出现上述错误,但在使用 Tomcat7、JDK 7 的 Windows 7 上,它工作正常。

java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.8) (fedora-65.1.10.8.fc15-i386)
OpenJDK Client VM (build 20.0-b11, mixed mode)

只需更改已安装的 JRE,我就可以轻松地在本地计算机上复制此错误,因此我尝试使用 1.6 编译类,但仍然遇到相同的错误。我该如何解决这个问题?

最佳答案

虽然您可以运行使用低于等于您正在使用的版本的Java版本编译的任何.class文件,但反之则不可能。

例如,您可以使用 JDK 6 进行编译并运行到 JRE 6 和 JRE 7,但不能使用 JDK 7 进行编译并运行到 JRE 6。

此错误:

Unsupported major.minor version 51.0

意味着您正在尝试运行 Java .class 文件,其 Java 版本低于用于编译该文件的 Java 版本。

That number (51.0)

major version number of the class file format being used.

      J2SE 8 = 52
      J2SE 7 = 51 <---------
    J2SE 6.0 = 50 
    J2SE 5.0 = 49 
     JDK 1.4 = 48 
     JDK 1.3 = 47 
     JDK 1.2 = 46 
     JDK 1.1 = 45 

在您的具体情况下,这意味着您正在使用 JDK 7 进行编译,并尝试使用较低的 Java 版本运行它。

那该怎么办?

如果您使用的是 Java 7 代码(Java 6 中不可用的结构),您别无选择,只能在 JRE 7 中运行代码(或在 Java 6 中重写代码) ...)。

如果您的代码符合 Java 6,您可以通过以下方式之一将其编译为与 Java 6 兼容:

  1. 使用JDK 6编译(可以与JDK 7一起安装);

  2. 使用JDK 7编译,但指定目标版本为Java 6:

    • 使用 JAVAC:

      javac -target 1.6
      
    • 使用 ANT:

      <javac srcdir="${src}"
            destdir="${build}"
           compiler="javac1.7"                 
             source="1.6"
             target="1.6"
               fork="true"
              debug="true" />
      
  3. 使用 Eclipse 进行编译(将使用其内部编译器,而不是安装的 JDK),并在编译器设置中指定您的目标是 Java 1.6:

    Eclipse compiler settings

  4. 使用 Maventhe following hacks 之一.

关于java - 为什么我在使用某些 JRE 时会收到 UnsupportedClassVersionError : Unsupported major. 次要版本 51.0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26517276/

相关文章:

java - Mockito 可以模拟包级可见性接口(interface)吗?

Java - 从具有两个给定索引的数组返回一个数组

java - 如何使用 OS Lollipop 在 Android 中裁剪 Java 图像

java - Swing 应用程序窗口未显示更改

java - 如何以编程方式在 Android 中锁定屏幕?

java - 如何获取运行 "exe"消耗的内存

java - SSL 套接字 : no cipher suites in common error

java - 如何通过一个查询从 mongo 查找和删除多个文档

java - 如何编写简单的公平信号量?

java - 如何在基于 Java 的 Android 应用程序中实现 Datastore?