作者:xiaoyan
项目场景:某客户由于安全合规要求,目前需将中间件由Weblogic由版本12.1.3升级至12.2.1.4,客户在自己研发的项目中调用了8C版本iServer中iserver-all.jar这个包,在不引用该包时,项目正常部署;引用该包时,项目部署失败,故定位到iserver-all.jar包与weblogic12.2.1.4兼容性问题。
由于同样的jar包,该问题在iServer 8C中也存在。
客户从iServer 8C中取出iserver-all.jar包,引用至自己开发的项目中,在引入该包时,项目编译运行通过,将打包好的war包部署至weblogic12.1.3成功,部署至weblogic12.2.1.4失败。问题定位到8c 版本iserver-all.jar与weblogic新版本之间兼容性问题。
既然jar包是从8C iServer中获取的,我们本地搭建了环境,使用iServer 8C进行测试,同样该问题可以复现。
问题出现在war包部署至weblogic过程中,通过查看
{Weblogic安装目录}\user_projects\domains{domain_name}\servers\AdminServer\logs
目录下的日志文件AdminServer.log,可以看到在部署iServer 8C时产生了大量的Warning和Error级别的日志,项目部署过程中出现Warning级别日志大多是由于项目不够规范,遵循的标准过旧导致的,并不影响项目的正常部署,通过排查日志中Error级别日志,最终定位到反馈部署失败原因的日志信息如下。
<2022-7-19 上午11时50分09,847秒 CST> <Error> <HTTP> <BEA-101216> <Servlet: "JAX-RS/Jersey#1" failed to preload on startup in Web application: "iserver.war".
org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.
分析报错,该报错是由org.glassfish.jersey抛出。
iServer 8C中使用Jersey版本为Jersey1。包名应为com.sun.jersey,而此处报错则显示使用的为Jersey2,包名为为org.glassfish.jersey。推测是Jersey版本过新,与iServer 8C不兼容导致。iServer war包内内置1.19版本Jersey,从报错看起来并没有被调用。
jersey1.X | com.sun.jersey |
---|---|
jersey2.X | org.glassfish.jersey |
经过多方沟通得知,Weblogic具有自动发现Jersey功能,正是由于该功能,在部署过程中会使用Weblogic内置Jersey,而Weblogic12.1.3对应Jersey1,Weblogic12.2.1.4对应Jersey2,最终出现冲突。
通过修改iServer 8C war包内WEB-INF文件夹下配置文件web.xml与weblogic.xml(位于war包目录/WEB_INF文件夹下),将产品包内Jersey设置为优先加载,再将Weblogic中自动发现Jersey功能关闭,即可正常启动iServer。配置方法如下:
web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>SuperMap iServer 8Cdisplay-name>
<filter>
<filter-name>iserver-servicesfilter-name>
<filter-class>com.supermap.server.host.webapp.ApplicationFilterfilter-class>
<async-supported>trueasync-supported>
filter>
<filter-mapping>
<filter-name>iserver-servicesfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<welcome-file-list>
<welcome-file>index.htmwelcome-file>
welcome-file-list>
<servlet>
<servlet-name>TurnOffJerseyServletservlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainerservlet-class>
<init-param>
<param-name>jersey.config.server.provider.packagesparam-name>
<param-value>org.noneparam-value>
init-param>
<init-param>
<param-name>jersey.config.disableAutoDiscoveryparam-name>
<param-value>trueparam-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>TurnOffJerseyServletservlet-name>
<url-pattern>/TurnOffJerseyServlet*url-pattern>
servlet-mapping>
web-app>
weblogic.xml
<weblogic-web-app
xmlns="http://www.bea.com/ns/weblogic/90">
<context-root>/iservercontext-root>
<container-descriptor>
<prefer-application-resources>
<resource-name>META-INF/services/*resource-name>
prefer-application-resources>
<prefer-application-packages>
<package-name>javax.ws.rs.*package-name>
<package-name>com.sun.jersey.*package-name>
prefer-application-packages>
container-descriptor>
weblogic-web-app>
直接用压缩软件打开war包修改,修改后保存,之后将该war包在weblogic控制台部署即可,部署流程与weblogic12.1.3相比不变。
之后部署成功。
weblogic12.2.1.4升级后对于校验更加严格,许多第三方库无法在该中间件下无法通过效验,经过验证,10i版本并不能部署在该中间件上,产品团队针对此情况,删减了部分iServer功能,调整后能够通过部署,正常运行。但例如hadoop相关功能,web打印等功能则不可用。若有需要请联系400-890-0866支持热线,和我们确认需求后,获取产品包。
最新版iServer 11i,针对高版本weblogic,短期内没有支持适配计划。请考虑如Tomcat之类其他中间件,或者直接下载deploy或者zip绿色包,直接解压使用。