Tomcat启动Guidewire PolicyCenter失败 抛出SecurityException异常
故障描述
通过Tomcat启动PolicyCenter服务器时,服务器进入启动流程后抛出PolicyCenter unable to start异常,服务无法正常拉起,核心错误堆栈如下:
Caused by: java.lang.SecurityException: class "org.osgi.service.log.LogLevel"'s signer information does not match signer information of other classes in the same package at java.lang.ClassLoader.checkCerts(ClassLoader.java:1150) ~[?:?] at java.lang.ClassLoader.preDefineClass(ClassLoader.java:905) ~[?:?] at java.lang.ClassLoader.defineClass(ClassLoader.java:1014) ~[?:?] at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) ~[?:?] at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2489) ~[catalina.jar:9.0.63] at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:875) ~[catalina.jar:9.0.63] at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1376) ~[catalina.jar:9.0.63] at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220) ~[catalina.jar:9.0.63] at org.eclipse.osgi.internal.log.EquinoxLogServices.<init>(EquinoxLogServices.java:90) ~[org.eclipse.osgi-3.13.300.jar:?] at org.eclipse.osgi.internal.framework.EquinoxContainer.<init>(EquinoxContainer.java:68) ~[org.eclipse.osgi-3.13.300.jar:?] at org.eclipse.osgi.launch.Equinox.<init>(Equinox.java:34) ~[org.eclipse.osgi-3.13.300.jar:?] at org.eclipse.osgi.launch.EquinoxFactory.newFramework(EquinoxFactory.java:27) ~[org.eclipse.osgi-3.13.300.jar:?] at com.guidewire.pl.system.service.osgi.OSGiServiceManager.start(OSGiServiceManager.java:102) ~[pl-10.100.0.jar:?] at com.guidewire.pl.system.server.InitTab.startDependency(InitTab.java:465) - (com.guidewire.pl.system.service.osgi.OSGiServiceManager@700654d0) ~[pl-10.100.0.jar:?] at com.guidewire.pl.system.server.InitTab.enterQuiesce(InitTab.java:723) ~[pl-10.100.0.jar:?] at com.guidewire.pl.system.server.InitTab.increaseRunLevelTo(InitTab.java:648) ~[pl-10.100.0.jar:?] ... 47 more
根因分析
抛出的SecurityException是JVM类加载阶段的证书校验失败:同一个org.osgi.service.log包下的类,来自两个签名信息不一致的JAR包。
从堆栈可以看到,启动流程初始化Equinox OSGi容器时加载LogLevel类触发校验,这类问题均由OSGi依赖重复引入导致:
- PolicyCenter 10.x版本自带指定版本的Eclipse Equinox OSGi框架依赖,相关JAR都经过统一签名
- 部署时如果在Tomcat公共
lib目录、或应用WEB-INF/lib目录下额外放入了其他版本的OSGi日志服务JAR(比如手动升级组件、拷贝其他应用依赖时误放入),两个来源的同包类签名不匹配,就会触发该安全异常阻断启动。
修复方案
- 排查冲突依赖:遍历两个路径查找重复JAR:Tomcat根目录
lib文件夹、PolicyCenter部署目录WEB-INF/lib文件夹,筛选所有文件名包含org.osgi.service.log的JAR包 - 移除冲突依赖:仅保留PolicyCenter官方原始发布包中内置的OSGi相关JAR,删除其余位置额外引入的版本不匹配的OSGi日志服务JAR,确保类加载路径下
org.osgi.service.log包下所有类均来自同一签名、同一版本的依赖包 - 清理缓存重启:清空Tomcat目录下
work、temp文件夹内的所有缓存文件,重新启动Tomcat验证服务启动状态。
内容的提问来源于stack exchange,提问作者MishaMosi
相关产品推荐
相关产品推荐

