为什么我得到UnsupportedClassVersionError:不支持的major.minor版本51.0与一些JRE?

时间:2014-10-22 21:16:47

标签: 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编译类但仍然遇到相同的错误。我该如何解决这个问题?

6 个答案:

答案 0 :(得分:1)

虽然您可以运行使用低于的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)

  

正在使用的类文件格式的主要版本号。

      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. 使用Maven the following hacks之一。

答案 1 :(得分:1)

非常感谢您帮助解决此问题。

以下是我为解决此问题所做的工作:我的网络服务器在我的本地计算机上使用的是java版本1.6.0_22-b22但是我有JDK 1.7,即使我尝试更改合规性级别,我也遇到了同样的错误。所以我改变了我的ant build XML文件:

 <javac srcdir="${src.dir}"
          destdir="${build.dir}/WEB-INF/classes"
          compiler="javac1.7"                 
          source="1.6"
          target="1.6"
          fork="true"
          debug="${compile.debug}"  
          debuglevel="${compile.debuglevel}"
          deprecation="${compile.deprecation}"
          optimize="${compile.optimize}"
          includeantruntime="false"
            >       
           <classpath refid="compile.classpath"/>
     </javac>

不仅如此:我还将已安装的JRE更改为1.6。

问题现已解决。

答案 2 :(得分:0)

UnsupportedClassVersionError意味着您正在运行Web服务器并使用不同的Java版本进行编译,使它们匹配并且您的问题将会消失:)

答案 3 :(得分:0)

要在eclipse中更改Java编译器,您应该同时更改两者:

  • 构建路径中的JRE库(删除1.7,然后添加1.6)
  • Java编译器(1.6而不是1.7)

答案 4 :(得分:0)

您使用JDK 7编译了代码,但是您使用JDK 6或更低版本运行它。

答案 5 :(得分:0)

如果您依赖的库是为较新版本的java编译的,则会发生这种情况。将这些库替换为为您的java版本编译的版本。通常,您可以找到相关库的旧版本。