Tomcat 9.0.75与ORDS 22.2/23.1兼容异常求助
我正在安装Oracle Apex 23.1,为访问开发界面及应用,在Windows环境部署了Tomcat 9.0.75与ORDS 23.1。将ORDS作为独立服务器运行时一切正常,但部署到Tomcat后,系统提示/ords资源不可用。
查看Tomcat的catalina日志,记录如下:
05-Jun-2023 14:30:47.570 SEVERE [main] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file 05-Jun-2023 14:30:47.616 SEVERE [main] org.apache.catalina.core.StandardContext.startInternal Context [/ords] startup failed due to previous errors 0
进一步查看localhost日志,核心错误为:
Error configuring application listener of class [oracle.dbtools.entrypoint.WebApplicationEntryPoint]
java.lang.UnsupportedClassVersionError: oracle/dbtools/entrypoint/WebApplicationEntryPoint has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 (unable to load class [oracle.dbtools.entrypoint.WebApplicationEntryPoint])
我已尝试安装最新版Java JDK/JRE、修改系统Path变量、配置Tomcat的JVM路径、解锁Oracle数据库必要用户,甚至将ORDS降级至22.2版本,但问题仍未解决。请问有什么解决建议?
以下是Tomcat的localhost日志完整内容:
05-Jun-2023 14:30:47.570 SEVERE [main] org.apache.catalina.core.StandardContext.listenerStart Error configuring application listener of class [oracle.dbtools.entrypoint.WebApplicationEntryPoint] java.lang.UnsupportedClassVersionError: oracle/dbtools/entrypoint/WebApplicationEntryPoint has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 (unable to load class [oracle.dbtools.entrypoint.WebApplicationEntryPoint]) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2475) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:875) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1376) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220) at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:487) at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:469) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:141) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4421) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4946) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:662) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1023) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1910) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.util.concurrent.AbstractExecutorService.submit(Unknown Source) at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:824) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1617) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:318) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423) at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:898) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:795) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322) at java.util.concurrent.FutureTask.run(Unknown Source) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.util.concurrent.AbstractExecutorService.submit(Unknown Source) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:871) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:249) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:428) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:914) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.startup.Catalina.start(Catalina.java:772) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478) 05-Jun-2023 14:30:47.570 SEVERE [main] org.apache.catalina.core.StandardContext.listenerStart Skipped installing application listeners due to previous error(s)
彻底确认Tomcat使用的JDK版本:
- 进入Tomcat的
bin目录,若没有setenv.bat则新建文件,添加以下内容强制指定Java 11及以上版本的JDK路径:set JAVA_HOME=C:\Program Files\Java\jdk-17.0.x set JRE_HOME=C:\Program Files\Java\jdk-17.0.x\jre - 启动Tomcat后,查看
localhost.log开头的JVM初始化信息,确认版本是否为Java 11+;也可启用Tomcat管理控制台,在系统信息中查看JVM版本。 - 排查系统中是否存在多个JDK/JRE实例,比如Windows自带的旧版Java,确保Tomcat没有默认调用这些低版本环境。
- 进入Tomcat的
重新生成匹配版本的ORDS WAR包:
- 明确ORDS版本要求:ORDS 22.2及以上版本必须运行在Java 11及以上环境,不能用Java 8部署。
- 切换到Java 11+的环境,重新执行
ords war命令生成WAR包,替换Tomcatwebapps目录下的旧WAR包。
清理Tomcat缓存与旧部署文件:
- 停止Tomcat服务,删除
Tomcat目录\work下的所有文件,同时删除webapps下的ords文件夹和ords.war文件。 - 将新生成的ORDS WAR包放入
webapps目录,重启Tomcat让其自动解压部署。
- 停止Tomcat服务,删除
检查Tomcat启动脚本的JVM参数:
打开Tomcat目录\bin\catalina.bat,确认脚本中没有硬编码指定低版本Java的路径或参数,避免强制Tomcat使用Java 8。
内容的提问来源于stack exchange,提问作者Fabio Ceron

