如何用Tomcat运行Guidewire CC WAR包?部署报错排查
问题描述
我需要使用Tomcat服务器启动Guidewire的CC WAR包,分别通过warTomcatDbcp和warTomcatJndi命令生成了两个WAR包,但启动Tomcat时两者均出现报错。为验证Tomcat本身无问题,我部署了一个小型Java项目的WAR包,可正常运行。
我使用的是OOTB版本,未做任何代码修改,且能通过Studio的Jetty服务器正常启动服务。
以下是启动Tomcat时获取的CC日志:
31-Oct-2023 09:02:57.488 SEVERE [main] org.apache.catalina.core.StandardContext.listenerStart Error configuring application listener of class [com.guidewire.pl.system.websocket.WebSocketServletContextListener] java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2352) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:800) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1317) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165) at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:491) at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:473) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:143) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4349) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4860) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) 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:712) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:975) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1952) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118) at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:776) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:426) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1659) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:114) at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402) at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:345) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:893) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:845) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:240) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:433) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:917) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.startup.Catalina.start(Catalina.java:795) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478) Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContextListener at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1353) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165) ... 51 more
请问gwb warTomcatDbcp或gwb warTomcatJndi是Guidewire中构建WAR包的正确方式吗?此外,构建正确的WAR包是否还需要其他步骤或配置?
问题解答
1. 构建命令的正确性
gwb warTomcatDbcp和gwb warTomcatJndi确实是Guidewire官方提供的、针对Tomcat环境构建WAR包的命令:
warTomcatDbcp:生成使用DBCP连接池的WAR包,适合直接在WAR包内部配置数据库连接参数warTomcatJndi:生成依赖Tomcat JNDI数据源的WAR包,需要在Tomcat服务器端预先配置数据源
2. 报错原因及解决步骤
日志中的NoClassDefFoundError: javax.servlet.ServletContextListener是核心问题,主要由以下原因导致,对应解决方法如下:
(1)版本兼容性问题
Guidewire的OOTB版本对Java、Tomcat的版本有严格匹配要求:
- 确认你使用的Java版本符合当前Guidewire版本的要求(例如部分Guidewire版本仅支持Java 8/11,而Tomcat 10+使用Jakarta Servlet API而非传统的javax.servlet,两者不兼容)
- 若使用Tomcat 10及以上版本,需确认Guidewire版本是否支持Jakarta API,否则建议降级到Tomcat 9及以下版本
(2)依赖冲突或缺失
- 检查生成的WAR包
WEB-INF/lib目录,确保没有包含servlet-api.jar——Tomcat本身已提供该依赖,WAR包中重复存在会引发类加载冲突 - 执行
gwb clean清理历史构建产物,再重新执行构建命令,确保构建过程无报错、依赖打包完整
(3)部署前的必要配置
构建完成后,还需根据WAR包类型完成对应配置:
- 针对warTomcatDbcp:
- 修改WAR包内
WEB-INF/classes/gwc.properties文件,配置正确的数据库连接URL、用户名、密码等参数 - 将对应数据库驱动(如Oracle的ojdbc.jar)放入Tomcat的
lib目录下
- 修改WAR包内
- 针对warTomcatJndi:
- 在Tomcat的
conf/context.xml中配置JNDI数据源,示例:<Resource name="jdbc/CCDB" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="dbuser" password="dbpass" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:ORCL"/> - 修改WAR包内
WEB-INF/classes/gwc.properties,将数据库配置指向JNDI名称:db.jndi.name=java:comp/env/jdbc/CCDB - 将数据库驱动放入Tomcat的
lib目录下
- 在Tomcat的
(4)构建环境验证
- 确保Studio Jetty使用的Java版本与Tomcat使用的版本一致
- 检查Guidewire项目的
build.properties文件,确认没有针对Tomcat的错误配置,保证构建时加载了正确的依赖集
内容的提问来源于stack exchange,提问作者Aravind Pillai
相关产品推荐
相关产品推荐

