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编译类但仍然遇到相同的错误。我该如何解决这个问题?
答案 0 :(得分:1)
虽然您可以运行使用低于的Java版或等于编译的任何.class文件,但相反的情况却是不可能的。
例如,您可以使用JDK 6进行编译并同时运行JRE 6和JRE 7,但是您无法使用JDK 7进行编译并运行到JRE 6中。
此错误:
Unsupported major.minor version 51.0
表示您正在尝试运行Java .class文件,其Java版本低于,而不是用于编译该文件的Java版本。
正在使用的类文件格式的主要版本号。
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的反向兼容性:
使用JDK 6 进行编译(您可以将它与JDK 7一起安装);
使用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" />
使用Eclipse 进行编译(将使用其内部编译器,而不是已安装的JDK),并在编译器设置中指定您的Java 1.6:
使用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编译器,您应该同时更改两者:
答案 4 :(得分:0)
您使用JDK 7编译了代码,但是您使用JDK 6或更低版本运行它。
答案 5 :(得分:0)
如果您依赖的库是为较新版本的java编译的,则会发生这种情况。将这些库替换为为您的java版本编译的版本。通常,您可以找到相关库的旧版本。