【问题标题】:Why am I getting an UnsupportedClassVersionError: Unsupported major.minor version 51.0 with some JREs? [duplicate]为什么我会收到 UnsupportedClassVersionError: Unsupported major.minor version 51.0 with some JREs? [复制]
【发布时间】:2014-10-22 21:16:47
【问题描述】:
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 编译类,但仍然遇到相同的错误。我该如何解决这个问题?

【问题讨论】:

  • 版本51.0表示编译器为jdk1.7!所以你需要为web服务器配置相同的版本。如果你想在 fedora 中运行它,你需要安装 jdk 7 并将这一行放在 .bashrc 'export JAVA_HOME=path to jdk1.7'
  • 感谢 Riadh 的响应,但是我无法更改 Web 服务器上的 Java 版本,所以我尝试在 eclipse 中更改合规级别 1.6,然后再次编译并尝试部署但无济于事。我什至尝试在我的本地机器上将 jdk 完全更改为 1.6 版

标签: java


【解决方案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:

  4. 使用 Maventhe following hacks 之一。

【讨论】:

  • 非常感谢 Andrea,我正在尝试按照您的建议进行更改。如果问题解决了,我会在这里更新。
  • @JulieD'Mello,如果有帮助,请考虑投票(向上箭头)并接受(标记左上角的白色 V 符号)答案
【解决方案2】:

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

这是我为解决此问题所做的:我的网络服务器在我的本地计算机上使用 java 版本 1.6.0_22-b22,但是我有 JDK 1.7,即使我尝试更改合规级别,我也遇到了同样的错误。所以我更改了我的 ant 构建 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。

问题现已解决。

【讨论】:

    【解决方案3】:

    UnsupportedClassVersionError 表示您正在运行网络服务器并使用不同的 java 版本进行编译,使它们匹配,您的问题就会消失 :)

    【讨论】:

    • 谢谢 Jose,但是在同一个 Web 服务器上还有其他应用程序,所以我不能在那里更改 Java 版本,我在我的机器上更改了 Jdk 版本但同样的错误。应用程序已部署但未启动。
    • 如果你尝试从你的 java 1.7 建立一个指向你的 1.6 路径的软链接怎么办?也许你在看不到的地方设置了 1.7
    【解决方案4】:

    要更改 Eclipse 中的 Java 编译器,您应该同时更改:

    • buildpath 中的 JRE 库(删除 1.7,然后添加 1.6)
    • Java 编译器(1.6 而非 1.7)

    【讨论】:

    • 也这样做了,但仍然是同样的错误。
    • 现在应用程序在我的本地机器上也失败了,其中 java_home 设置为 JDK 1.7,但它显示更多错误:
    • java.lang.IllegalAccessError: 试图从 com.opensymphony.xwork2.ActionContext 类访问 com.opensymphony.xwork2.ActionContext$1 类
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 对不起,这是一个答案,不过我可能应该改写一下。但是我现在看到问题已经解决了,尽管没有一个答案被接受。
      • 我现在编辑了它。我认为它可能会为遇到我经常遇到的同样问题的人增加一些价值。
      • 不错,看起来不错。
      猜你喜欢
      • 1970-01-01
      • 2016-12-01
      • 2012-09-02
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多