You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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:
    1. 修改WAR包内WEB-INF/classes/gwc.properties文件,配置正确的数据库连接URL、用户名、密码等参数
    2. 将对应数据库驱动(如Oracle的ojdbc.jar)放入Tomcat的lib目录下
  • 针对warTomcatJndi:
    1. 在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"/>
      
    2. 修改WAR包内WEB-INF/classes/gwc.properties,将数据库配置指向JNDI名称:
      db.jndi.name=java:comp/env/jdbc/CCDB
      
    3. 将数据库驱动放入Tomcat的lib目录下

(4)构建环境验证

  • 确保Studio Jetty使用的Java版本与Tomcat使用的版本一致
  • 检查Guidewire项目的build.properties文件,确认没有针对Tomcat的错误配置,保证构建时加载了正确的依赖集

内容的提问来源于stack exchange,提问作者Aravind Pillai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:04:59