java.lang.UnsupportedClassVersionError:JDK版本不一致報錯


交代一下背景:公司運行的一個上線項目,打了個補丁發給客戶后,反饋說運行不了。把源碼拿回來場景重現。貼上報錯信息:

08-15 14:13:29 ERROR doPost(jcm.framework.rmi.RMIServlet:155) - SchedulerService.forceRunJobFlow error.
未指定錯誤,請查看詳細信息
    at jcm.framework.rmi.ClientService.execute(ClientService.java:129)
    at ...(...)
    at jcm.flowengine.impl.JobFlowEngine.runJobFlow(JobFlowEngine.java:230)
Caused by: java.lang.UnsupportedClassVersionError: jcm/flowengine/impl/JobFlowInstance : Unsupported major.minor version 52.0 (unable to load class jcm.flowengine.impl.JobFlowInstance)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2908)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1173)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1681)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at jcm.flowengine.impl.JobFlowEngine.runJobFlow(JobFlowEngine.java:230)
    at jcm.scheduler.impl.StdScheduler.forceRun(StdScheduler.java:190)
    at jcm.scheduler.service.SchedulerService.forceRunJobFlow(SchedulerService.java:57)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at jcm.framework.rmi.ClientService.execute(ClientService.java:113)
    at jcm.framework.rmi.RMIServlet.doPost(RMIServlet.java:113)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1822)
    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)

查看報錯信息,發現是由於JDK版本不對導致。客戶運行的項目編譯版本是JDK1.5,補丁編譯版本是JDK1.8。

要解決這問題,首先我們得知道客戶運行的版本是多少。這里有個方法:隨便復制一個客戶項目的jar包,用解壓縮工具解壓,在CMD命令中切換到當前

目錄,輸入命令:javap -verbose classname

classname為解壓出來的任意一個class文件名。

會一下信息輸出:

Classfile /E:/abc/JCMCommon/jcm/common/LogInfo.class
  Last modified 2015-6-3; size 3087 bytes
  MD5 checksum 8d1347215ae5933e04ad60dacbadfe41
  Compiled from "LogInfo.java"
public abstract class jcm.common.LogInfo extends java.lang.Enum<jcm.common.LogInfo>
  Signature: #138                         // Ljava/lang/Enum<Ljcm/common/LogInfo;>;
  SourceFile: "LogInfo.java"
  InnerClasses:
       static final #8; //class jcm/common/LogInfo$1
       static final #12; //class jcm/common/LogInfo$2
       static final #16; //class jcm/common/LogInfo$3
       static final #20; //class jcm/common/LogInfo$4
       static final #24; //class jcm/common/LogInfo$5
       static final #28; //class jcm/common/LogInfo$6
       static final #32; //class jcm/common/LogInfo$7
       static final #36; //class jcm/common/LogInfo$8
       static final #40; //class jcm/common/LogInfo$9
       static final #44; //class jcm/common/LogInfo$10
       static final #48; //class jcm/common/LogInfo$11
       static final #52; //class jcm/common/LogInfo$12
       static final #56; //class jcm/common/LogInfo$13
       static final #60; //class jcm/common/LogInfo$14
       static final #64; //class jcm/common/LogInfo$15
       static final #68; //class jcm/common/LogInfo$16
       static final #72; //class jcm/common/LogInfo$17
       static final #76; //class jcm/common/LogInfo$18
       static final #80; //class jcm/common/LogInfo$19
       static final #84; //class jcm/common/LogInfo$20
  minor version: 0
  major version: 49
  flags: ACC_PUBLIC, ACC_SUPER, ACC_ABSTRACT, ACC_ENUM
。。。。。。

信息可能很多,看不到前面的信息。可以用命令:javap -verbose classname >文本文件名.txt ,把信息寫入文件。從上面信息可以查看版本信息

minor version: 0
major version: 49

查看JDK版本對應關系:

34(對應十進制的50):JDK1.8

33(對應十進制的50):JDK1.7

32(對應十進制的50):JDK1.6

31(對應十進制的49):JDK1.5

30(對應十進制的48):JDK1.4

2F(對應十進制的47):JDK1.3

2E(對應十進制的46):JDK1.2

可以看出,項目的編譯版本是1.5,打補丁根據對應的版本編譯就不會有問題了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM