当前位置: 首页 > backend >正文

WebSphere Application Server(WAS)8.5.5教程第五讲

续前篇!

一、Web 应用部署与类加载策略

Web 应用部署与类加载策略是 WebSphere Application Server(WAS)日常管理的核心部分,尤其对运行大型企业级 Java 应用(如 BAW)非常关键。本讲将分两部分讲解:

1、目标

1. Web 应用部署:如何安装、更新、卸载 WAR/EAR 包

2. 类加载策略:如何解决类冲突、提升加载效率

2、Web 应用部署(WAR / EAR 包)

部署入口

路径如下:
应用程序WebSphere企业应用程序

 

1. 安装新应用

步骤:
  1. 点击【安装】

  2. 选择上传方式:

    • 从本地上传 .war / .ear 文件

    • 或者从服务器路径安装(/opt/IBM/xyz.ear)

  3. 点击【下一步】,按提示填写信息

    • 应用名称(可以修改)

    • 目标服务器(选定一个 WebSphere 实例)

    • 安装目录设置(一般保持默认)

  4. 重要步骤:配置 上下文根(Context Root)

    • 例如:/bawportal,则访问地址为 http://host:port/bawportal

  5. 点击【完成】,然后【保存主配置】

  6. 启动应用程序(在“企业应用程序”列表中选中 ➝ 启动)

2. 更新已有应用

路径:
WebSphere企业应用程序 ➝ 点击应用名 ➝ 点击“更新”

选项:

  • 更新整个 EAR 包(替换旧包)

  • 更新单个模块(如只替换 *.war

  • 更新类、资源文件等(增量更新)

3. 卸载应用

路径:
WebSphere企业应用程序 ➝ 勾选目标 ➝ 点击【卸载】

注意事项:

  • 安装后不要忘记点击右上角的【保存到主配置】

  • 每次安装/更新后建议重启对应服务器,清理缓存

  • 部署 BAW 类 Portal 或 Process App 时,路径/依赖较多,注意 WAR 中 web.xml 和 ClassPath 定义

3、类加载策略

在 WebSphere 中,不同组件之间共享类路径,有时会导致类冲突(比如 Jackson、Log4j 不同版本),所以类加载策略管理非常重要。

类加载相关配置位置:

  1. 服务器级别设置:
    服务器 ➝ 点击目标服务器 ➝ 应用程序设置类装入器策略

  2. 应用程序级别设置:
    企业应用程序 ➝ 点击应用名称 ➝ 类装入器

    模块级别设置(Web 模块 / EJB 模块)

 

两种主要策略:

策略名称含义推荐情况
父类优先(Parent First)默认方式,优先加载 WAS 共享类稳定、安全,适合大部分业务应用
父类最后(Parent Last)优先加载应用自己提供的类(打包在 WAR/EAR 中)防止冲突,适合使用特殊第三方包的情况
设置位置:
  • 下拉选择:类装入方式(Class loader mode)
    ➤ 选择 Parent last 可优先加载应用自己的类

 

使用场景举例:

情况建议策略
使用 Spring Boot 打包的 WARParent last,防止依赖冲突
部署 IBM 官方应用Parent first(默认即可)
出现 ClassNotFoundException / NoSuchMethodError尝试切换策略排查
多个 WAR 共用 jar 包时建议使用 Shared Library(共享类库机制)

4、补充:共享库(Shared Libraries)

如果多个应用使用相同的 jar 包(如 log4j.jar、common-utils.jar),建议配置为共享库,避免冗余加载。

创建方式:

  1. 环境共享库

  2. 新建共享库 ➝ 指定 jar 包目录

  3. 在应用级别(企业应用程序 ➝ 应用 ➝ 共享库映射)挂载该库

 

5、实战调优建议

问题原因应对措施
应用启动慢类太多或依赖冲突开启类加载跟踪、检查依赖树
类冲突报错同类名不同版本设置 Parent last、使用 Shared Library
ClassNotFound 异常类路径未配置检查 WAR/EAR 中 META-INF 及 lib
应用隔离需求多版本 jar 并存各应用用独立类加载器或 Docker

6、总结

重点点位说明
安装、更新、卸载入口WebSphere企业应用程序
上下文根配置决定 URL 访问路径
类装入策略位置服务器级 or 应用级均可设置
推荐默认策略Parent first(安全),遇冲突时用 Parent last

二、案例: BAW在WAS中的类加载策略与依赖管理机制

 下面来深入梳理 IBM Business Automation Workflow(BAW) 在 WebSphere Application Server (WAS) 中的 类加载策略与依赖管理机制,这有助于你深入理解 BAW 各组件运行背后的逻辑,进而定位问题、调优或安全管控。

1、BAW 在 WAS 中的部署结构概览

BAW 其实是由多个模块打包成一个或多个 企业应用(EAR) 部署到 WAS 中的,核心包括:

模块描述类加载来源
BAW Process Server EAR流程执行引擎EAR ➝ BAW Runtime jar
BAW Process Portal WAR用户门户界面WAR ➝ Portal UI 组件
BAW Process Designer浏览器建模工具部署为 Web 应用或远程组件
BAW Business Rules决策/规则服务WAR ➝ ODM 核心库
Common Services如 UCA、事件监听等Shared Libraries ➝ com.lombardi., ibm.bpm.

2、类加载策略在 BAW 中的实际应用

IBM 官方默认使用策略:

应用层级默认策略说明
BAW EAR 主应用Parent First优先加载 WAS 提供的 BPM 内核类
BAW WAR 模块(如 Portal)Parent Last避免 UI 层与 WAS 内部类冲突
扩展/定制应用推荐 Parent Last避免与 BAW runtime jar 冲突

可在 WAS 控制台:

  • 应用程序 ➝ 企业应用程序 ➝ 点击模块 ➝ 类装入器 ➝ 设置类加载方式

示例:防止 Jackson 冲突

BAW 内置 Jackson(如 com.fasterxml.jackson.core),但你部署的自定义服务也用了别的版本?
解决方案:

  • 你的自定义模块设置为 Parent Last

  • 或用 Shared Library 管理 Jackson,并为各应用指定绑定版本

3、依赖管理方式

1. 内部依赖(BAW Runtime 组件)

常见 JAR 包(这些位于安装目录,例如 /opt/IBM/Workflow/lib):

文件名功能
bpmserver.jarBAW 流程引擎核心
teamworks.jar老版 BPM 核心
businessrules.jarODM 引擎
restconnector.jarREST 连接器
ucaservice.jar调度与消息服务

这些 jar 不可擅自替换,否则会导致版本冲突或运行异常。

2. 外部依赖(自定义服务所用)

如:

  • spring-core.jar

  • mybatis.jar

  • jackson-databind.jar

通常放置在:

  • WAR 模块中的 /WEB-INF/lib

  • EAR 的 libAPP-INF/lib

  • Shared Library 中统一管理

4、类加载调试技巧

开启类加载跟踪日志:

在 JVM 参数中添加:

-Dibm.cl.verbose=true

 可以在 WAS SystemOut.log 中看到加载类的来源,例如:

[2/20/25 13:22:11:123 CST] 00000001 SystemOut     O CL Verbose: Loaded class [com.fasterxml.jackson.databind.ObjectMapper] from [file:/opt/IBM/Workflow/lib/jackson-databind.jar]

常见冲突问题排查

现象原因应对方式
ClassCastException同一类被不同类加载器加载设置 Parent Last,或统一使用 Shared Library
ClassNotFoundException类在 WAR 内未打包检查 lib 路径,或导入共享库
Portal 页面空白JS 库冲突或 Portal 模块类问题检查 WAR 配置和类加载策略
自定义服务调用失败缺 jar 或版本冲突检查 EAR 打包结构、依赖版本匹配性

最佳实践总结

操作场景建议
部署标准 BAW 应用保持 IBM 默认类加载设置
部署自定义扩展设置模块类加载为 Parent Last,放置独立 jar
多模块共享 jar配置 Shared Library,避免重复打包
出现冲突或异常开启类加载跟踪日志,查清加载路径
依赖管理使用 Maven 构建打包,控制版本准确性

 未完,待续!

http://www.xdnf.cn/news/7380.html

相关文章:

  • Python网络爬虫入门指南
  • Git初始化本地已有项目,并推送到远端Git仓库完整操作指南
  • ebpf简介
  • Visual Studio解决方案构建三剑客:生成/重新生成/清理完全指南(实战经验总结)
  • 60天python训练计划----day30
  • GloVe 模型讲解与实战
  • 淘宝商品详情PAI接口可以获取哪些信息?
  • 人工智能重塑医疗健康:从辅助诊断到个性化治疗的全方位变革
  • React 个人笔记 Hooks编程
  • android双屏之副屏待机显示图片
  • leetcode 每日一题 1931. 用三种不同颜色为网格涂色
  • autoDL算力云装Xinference[坑与步骤]
  • JDK 21新特性详解
  • 网络学习-epoll(四)
  • lowcoder数据库操作5:使用饼图显示多个数据查询
  • 羽毛球订场小程序源码介绍
  • 数据库(一):分布式数据库
  • Java 反射(Reflection)技术
  • linux安装git
  • 二叉树-模版题单
  • 使用tcs34725传感器和51单片机识别颜色
  • git仓库中.git 文件很大,怎么清理掉一部分
  • 国标GB28181视频平台EasyGBS校园监控方案:多场景应用筑牢安全防线,提升管理效能
  • 【学习笔记】机器学习(Machine Learning) | 第七章|神经网络(2)
  • Rust 学习笔记:错误处理
  • Web 技术与 Nginx 网站环境部署
  • Pycharm 选择Python Interpreter
  • 酒水饮料批发零售商城小程序开发
  • 深入浅出程序设计竞赛(洛谷基础篇) 第十三章 二分查找与二分答案
  • 小米MUJIA智能音频眼镜来袭