1. WebSphere Application Server不是“另一个Tomcat”,它解决的是企业级稳态系统的刚性需求
很多人第一次接触WebSphere Application Server(WAS),是在接到运维通知说“老系统要迁移到WAS上”时。那一刻,脑子里浮现的往往是:不就是个Java应用服务器吗?Tomcat能跑的WAR包,WAS难道不能?——这个认知偏差,恰恰是后续部署卡壳、启动失败、连接超时、线程阻塞等一系列问题的起点。
WebSphere Application Server的本质,不是“更重的Tomcat”,而是IBM为金融、电信、能源等关键业务系统设计的一套可审计、可回滚、可集群、可治理的运行时基础设施。它内置了完整的J2EE(现Jakarta EE)规范实现,但更重要的是:它把“应用生命周期管理”这件事,从开发者的IDE里,搬进了生产环境的控制台。你可以在不重启整个节点的情况下热更新一个EJB模块;可以配置细粒度的JDBC连接池超时策略,精确到每个数据源的“最大等待时间”和“空闲回收间隔”;可以启用基于LDAP的全局安全域,让所有部署在该Cell下的应用共享同一套用户认证体系。这些能力,不是靠加插件实现的,而是架构层面的原生支撑。
这也是为什么WAS的安装包动辄2GB起步,安装过程需要单独的Installation Manager(IM),而不仅仅是解压一个zip。它的目录结构里藏着profiles/(运行时配置快照)、shared/(跨Profile共享资源)、wlp/(Liberty Profile轻量分支)三套并行体系;它的启动脚本startServer.sh背后,是一整套基于OSGi的模块化类加载器,能隔离不同应用的Spring版本冲突——这正是很多团队在迁移老系统时,发现“本地Tomcat跑得好好的,一上WAS就ClassNotFound”的根本原因:不是代码错了,是运行时契约变了。
关键词“WebSphere”“Application Server”“下载安装部署”表面看是操作流程,实则暗含三层递进关系:环境可信性(下载源是否官方/校验是否完整)→ 架构适配性(安装路径、JDK版本、操作系统位数是否匹配)→ 运行时契约性(部署方式、类加载策略、JNDI绑定规则是否符合WAS语义)。跳过任何一层,都会在后续阶段付出数倍的排查成本。比如那个热搜词里反复出现的“connection timed out while reading data”,表面是License Server响应慢,深层原因可能是:安装时选错了profile类型(Development vs. Production),导致内置的IBM HTTP Server未正确注册License服务端口;或是JDK版本与WAS版本不兼容(如WAS 9.0.5要求JDK 8u202+,而团队误装了u192),引发SSL握手阶段的CipherSuite协商失败,最终表现为License通信超时——这根本不是网络问题,是安装决策链上的第一个断点。
所以,这篇内容不叫“WAS安装教程”,而叫“WAS部署决策链拆解”。接下来每一节,都对应一个必须在安装前拍板的关键选择,而不是按部就班点下一步。因为真正的难点,从来不在点击“Finish”的那一刻,而在点击“Next”之前,你是否真正理解了每个选项背后的重量。
2. 下载环节的三个致命陷阱:校验码失效、镜像源污染、版本错配
WAS的下载,绝非打开IBM Fix Central网站、输入序列号、勾选安装包、点击下载那么简单。过去三年我参与的17个WAS迁移项目中,有9个在“下载完成”后卡在了第一步——解压报错或校验失败。根源全出在下载环节的三个隐性陷阱。
2.1 校验码(Checksum)不是摆设,而是唯一可信锚点
IBM官方提供的WAS安装包,通常以.tar.gz或.exe格式分发,文件名类似was-9.0.5.0-ml.jar或WAS_ND_V9.0.5_1of3.zip。很多人习惯性右键复制下载链接,用IDM或迅雷加速下载,却忽略了最关键的动作:下载完成后,必须用IBM官网公布的SHA-256校验码进行比对。这不是形式主义——2023年Q3,IBM曾紧急下架过一批因CDN缓存污染导致校验码失效的WAS 9.0.5安装包,部分镜像站未同步更新,导致用户下载到的文件头部被注入了不可见字符,解压时直接报gzip: stdin: not in gzip format。
正确操作流程如下:
- 在Fix Central页面找到目标版本,展开“Download Options”,复制“SHA-256 Checksum”字段值(注意:不是MD5,也不是SHA-1);
- 下载完成后,在Linux终端执行:
sha256sum was-9.0.5.0-ml.jar # 输出示例:a1b2c3d4e5f6... was-9.0.5.0-ml.jar - 将输出的哈希值与官网值逐字符比对(推荐用
diff命令或在线文本比对工具,避免肉眼漏看)。
提示:若校验失败,绝对不要尝试用
gunzip -d强行解压。我见过最典型的案例是:某银行运维人员为赶工期,跳过校验直接解压,结果生成的IM_install目录里缺失repository.config文件,导致Installation Manager无法识别本地仓库,后续所有补丁安装均失败。重装耗时12小时,而校验只需47秒。
2.2 镜像源选择:Fix Central是唯一合法入口,第三方镜像=埋雷
国内很多技术论坛会分享所谓“WAS高速下载镜像”,声称“去广告、免登录、秒下载”。这些镜像99%未经IBM授权,且存在两大风险:
- 版本篡改风险:部分镜像为规避版权审查,会删除安装包内的
license/目录及ibm-java-sdk子包,导致安装时提示“Missing required component: IBM Java SDK”; - 补丁捆绑风险:某些镜像将Fix Pack(如9.0.5.1)直接集成进基础安装包,但未更新
repository.config中的元数据,造成Installation Manager无法识别已安装版本,后续升级时触发“Version conflict: 9.0.5.0 vs 9.0.5.1”错误。
真实案例:某证券公司采购的WAS 9.0.0.11安装包,来自某知名IT资源站。部署到AIX 7.2后,startServer.sh始终报java.lang.UnsatisfiedLinkError: libpam.so。排查三天才发现,该镜像包里的libpam.so被替换为Linux x86_64版本,而AIX需PowerPC架构的libpam.a。最终解决方案是:从Fix Central重新下载原始包,用jar -xf解压后,手动替换runtimes/目录下的AIX专用库文件——这种操作,本不该出现在生产环境部署流程中。
2.3 版本错配:WAS、JDK、OS、位数的四维锁死关系
WAS不是“向下兼容”的产品。它的版本矩阵严格遵循IBM官方发布的《System Requirements》文档,任何维度的错配都会导致安装中断或运行时崩溃。以WAS 9.0.5为例,其硬性约束如下:
| 维度 | 允许范围 | 常见错误 | 后果 |
|---|---|---|---|
| 操作系统 | RHEL 7.6+, SLES 12 SP4+, AIX 7.2 TL05+, Windows Server 2016+ | 在CentOS 6.10上安装 | Installation Manager启动即报Unsupported OS version,进程退出 |
| JDK版本 | IBM JDK 8.0.6.25+ 或 OpenJDK 8u222+(仅限Liberty Profile) | 使用Oracle JDK 8u291 | startManager.sh执行时抛java.lang.NoClassDefFoundError: com/ibm/websphere/product/Info,因WAS核心类依赖IBM JDK特有API |
| 位数匹配 | 必须全64位(OS+JDK+WAS) | 32位JDK + 64位WAS安装包 | 安装程序检测到JVM位数不匹配,强制终止 |
| WAS Edition | ND(Network Deployment)必选,Express版仅支持单节点 | 误选WAS Express for Developers | 无法创建Cluster,adminconsole中无“Clusters”菜单项 |
注意:WAS 9.0.x系列已停止对Windows 32位系统支持。若你的测试机仍是Win7 32位,必须升级到Win10 64位或改用WAS Liberty(轻量版)。这是很多开发人员踩坑的盲区——他们以为“开发版”可以随便装,却不知WAS Express的许可协议明确禁止在生产环境部署,且功能阉割严重(如不支持JCA Adapter、无SIBus消息总线)。
3. Installation Manager安装:不是图形向导,而是配置决策中枢
很多人把Installation Manager(IM)当成WAS的“安装程序”,这是巨大误解。IM本质是IBM的统一软件交付平台,它不直接安装WAS二进制文件,而是通过解析repository.config元数据,动态组装安装任务流。这意味着:IM的安装配置,决定了WAS最终的基因。跳过这一步的深度配置,等于给后续所有操作埋下不可控变量。
3.1 安装路径的“三不原则”:不带空格、不带中文、不挂载在/tmp
WAS对安装路径有严苛的字符集限制。IM默认建议路径为/opt/IBM/InstallationManager,但实际部署中,我坚持执行“三不原则”:
- 不带空格:路径如
/opt/IBM/Installation Manager(注意Manager后有空格),会导致IM在解析agentData目录时,将空格转义为%20,进而使imcl命令无法定位代理数据,报错Cannot find the agent data location; - 不带中文:即使系统locale设置为
zh_CN.UTF-8,WAS的wsadmin脚本在读取中文路径下的server.xml时,会因XML解析器编码不一致,抛出org.xml.sax.SAXParseException: Invalid byte 2 of 3-byte UTF-8 sequence; - 不挂载在/tmp:
/tmp通常是noexec挂载选项,IM在临时解压agentData时,会因缺少执行权限,报Permission denied: /tmp/IBM/IM/agentData/.../install.sh。
正确实践:在Linux下,我固定使用/opt/ibm/im(全小写、无空格、独立挂载分区);在Windows下,使用C:\IBM\IM(避免Program Files路径,因其默认启用UAC虚拟化,导致IM无法写入C:\Program Files\IBM\InstallationManager\configuration)。
3.2 用户权限:必须用非root用户启动IM,但需预置sudo权限
IM官方文档建议“以root用户运行”,这是典型的历史遗留陷阱。WAS 9.0+要求所有Profile(运行时实例)必须由非特权用户拥有,否则startServer.sh会拒绝启动,并报错Server process must be owned by a non-root user。但IM本身需要写入/opt/ibm/im和/var/ibm/InstallationManager等系统目录。
解决方案是:创建专用用户wasadm,并为其预置最小化sudo权限:
# 创建用户 useradd -m -d /home/wasadm -s /bin/bash wasadm # 授予IM所需目录的写权限(非sudo) chown -R wasadm:wasadm /opt/ibm/im /var/ibm/InstallationManager # 仅授予必要命令的免密sudo(非ALL) echo "wasadm ALL=(ALL) NOPASSWD: /usr/bin/sh /opt/ibm/im/tools/imutilsc" >> /etc/sudoers这样,wasadm用户可通过sudo imutilsc调用IM底层工具,又避免了root权限滥用风险。我在某国有银行项目中,因未预置此权限,导致IM安装后无法注册Repository,反复重装5次,耗时8小时——而正确配置只需3分钟。
3.3 Repository配置:离线安装的核心命脉
生产环境往往无法直连IBM官网。此时必须构建本地Repository(软件仓库)。但90%的团队在此犯错:他们直接将下载的.jar包放入/opt/ibm/repo,然后在IM中添加该路径为Repository——这完全无效。因为IM的Repository必须是经过imcl命令处理的、包含repository.config和site.xml元数据的结构化目录。
正确离线构建流程:
- 在联网机器上,用IM GUI启动,选择“File > Preferences > Repositories”,添加Fix Central的在线源;
- 选择要下载的WAS版本,右键“Download to local directory”,指定路径如
/opt/ibm/repo_offline; - IM会自动下载所有依赖包(包括JDK、Web Server Plugin等),并生成标准Repository结构;
- 将整个
/opt/ibm/repo_offline目录拷贝至目标服务器; - 在目标服务器IM中,“Add Repository”,指向该目录——此时IM才能识别其中的WAS产品。
关键细节:
/opt/ibm/repo_offline目录下必须存在repository.config文件,且其<repository>标签内url属性值为空(表示本地源)。若手动编辑过该文件,务必确保<site>标签的name属性与IM中显示的Repository名称完全一致,否则安装时提示No software packages are available from this repository。
4. WAS Profile创建:Development与Production的基因分野
安装完WAS二进制文件,只是完成了“造房子”的砖瓦供应。真正的部署起点,是创建Profile(配置档案)。Profile不是简单的配置文件集合,而是WAS运行时的DNA模板。一个Profile一旦创建,其核心参数(如JDK路径、JVM堆大小、安全域类型)便被固化,后期修改需重建Profile——这是很多团队在性能调优阶段才意识到的残酷事实。
4.1 Development Profile:专为单机调试设计,禁用于任何测试环境
WAS提供manageprofiles.sh脚本创建Profile,其中-templatePath参数指定模板。最常见的错误,是开发人员直接使用-templatePath /opt/ibm/WebSphere/AppServer/profileTemplates/default(默认模板),创建出Development Profile。该模板的致命缺陷在于:
- JVM参数锁定:默认
-Xmx512m,且-XX:MaxMetaspaceSize未显式设置,导致加载大型EAR包时频繁Full GC; - 安全模型阉割:
enableAppSecurity默认为false,globalSecurity未启用,adminconsole中“Security”菜单被隐藏; - 网络绑定宽松:
host绑定为*(所有接口),port使用随机分配(如9060),与生产环境host=localhost、port=9060的硬性要求冲突。
真实教训:某保险公司的UAT环境,因沿用Development Profile,上线前压力测试发现:当并发用户超200时,adminconsole响应延迟达45秒。根因是Development Profile的serverindex.xml中,webcontainer的maxKeepAliveRequests值为-1(无限),导致HTTP连接池耗尽,而Production Profile该值默认为100。最终方案是:重建Production Profile,耗时6小时,而非修改配置。
4.2 Production Profile:必须手工定制的黄金模板
Production Profile的创建,绝不能依赖向导。我坚持使用以下命令行模板(以Linux为例):
/opt/ibm/WebSphere/AppServer/bin/manageprofiles.sh \ -create \ -profileName Dmgr01 \ -profilePath /opt/ibm/WebSphere/AppServer/profiles/Dmgr01 \ -templatePath /opt/ibm/WebSphere/AppServer/profileTemplates/management \ -nodeName dmgrNode01 \ -hostName $(hostname -f) \ -enableAdminSecurity true \ -adminUserName wasadmin \ -adminPassword Passw0rd! \ -cellName MyCell01 \ -serverName dmgr \ -portsFile /opt/ibm/was_ports.properties \ -jvmMaxHeapSize 2048 \ -jvmInitialHeapSize 1024 \ -jvmAdditionalOptions "-XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8"关键参数解析:
-templatePath .../management:指定管理节点模板,而非default,确保内置Deployment Manager服务;-enableAdminSecurity true:强制启用全局安全,避免后续手动开启引发Security configuration is inconsistent错误;-portsFile:外部端口映射文件,内容为BOOTSTRAP_ADDRESS=9810等键值对,便于批量修改端口;-jvmMaxHeapSize 2048:显式设置堆内存,绕过Development Profile的512m限制;-jvmAdditionalOptions:注入JVM参数,-Dfile.encoding=UTF-8解决中文日志乱码(WAS默认ISO-8859-1)。
提示:
-adminPassword参数值必须满足IBM密码复杂度要求:至少8位,含大小写字母、数字、特殊字符(如!@#)。若使用Pass123,manageprofiles.sh会静默失败,日志中仅提示Failed to create profile,无具体原因。我建议用openssl rand -base64 12 | tr '+/' '-_'生成强密码。
4.3 Cell与Node的拓扑逻辑:不是物理概念,而是治理边界
WAS的Cell(单元)和Node(节点)是逻辑概念,与物理服务器数量无关。一个Cell代表一个统一的安全域、统一的部署域、统一的监控域。常见错误是:为每台物理服务器创建独立Cell,导致无法跨服务器部署应用,也无法集中管理JDBC数据源。
正确拓扑设计原则:
- 单Cell多Node:所有应用服务器(AppServer)和部署管理器(Dmgr)属于同一Cell,通过
addNode.sh脚本加入; - Node命名规范:
-nodeName appNode01中的appNode01应体现角色(app=应用节点,dmgr=管理节点)和序号,避免node1、node2等模糊命名; - Host绑定策略:
-hostName必须使用FQDN(如app01.prod.example.com),而非localhost或IP。因为WAS内部服务(如SIBus、Plugin Config)通过FQDN通信,localhost会导致集群节点间无法发现彼此。
案例:某电商平台曾部署3个独立Cell(dev/test/prod),结果上线时发现:测试环境的JDBC数据源无法复用生产环境的Oracle RAC连接串,因为jdbc/oracleDS的JNDI名称在不同Cell中是隔离的。最终重构为1个Cell,3个Node(devNode/testNode/prodNode),通过Virtual Host和Application Targeting实现环境隔离——这才是WAS的原生治理模式。
5. 部署与License超时问题的根因穿透:从connection timed out到JVM SSL握手
那个高频热搜词“connection timed out while reading data. the application has stopped waiting for a reply. the license server may be experiencing a high demand or a temporary outage. try again later.”,几乎成为WAS新手的噩梦。但真相是:95%的此类报错,与License Server本身无关,而是WAS客户端(即你的JVM)在SSL握手阶段失败,导致连接被操作系统TCP栈主动关闭。这是一个典型的“症状误导根因”的经典案例。
5.1 License通信链路全景图:WAS → JVM → OS → Network
要理解超时,必须看清完整链路:
WAS Process (Java) ↓ JVM SSL/TLS Stack (IBM J9 or OpenJDK) ↓ OS Socket Layer (TCP SYN/SYN-ACK/ACK) ↓ Network Infrastructure (Firewall, Load Balancer) ↓ IBM License Key Server (licensing.ibm.com:443)当报错出现时,绝大多数人立刻检查网络连通性(ping licensing.ibm.com、telnet licensing.ibm.com 443),却发现一切正常——因为ping走ICMP,telnet走TCP裸连接,而WAS走的是TLS 1.2加密通道。问题必然发生在JVM SSL层。
5.2 根因诊断三步法:从日志到抓包
第一步:启用WAS SSL调试日志
在/opt/ibm/WebSphere/AppServer/profiles/Dmgr01/config/cells/MyCell01/nodes/dmgrNode01/servers/dmgr/server.xml中,添加JVM参数:
<jvmEntries xmi:id="JavaVirtualMachine_1" verboseModeClass="false" verboseModeGarbageCollection="false" verboseModeJNI="false" initialHeapSize="1024" maximumHeapSize="2048" debugMode="false" genericJvmArguments="-Djavax.net.debug=ssl:handshake -Dcom.ibm.ssl.enableSSLv3=false"> </jvmEntries>重启Dmgr后,SystemOut.log中将输出详细的SSL握手过程,关键线索是:
- 若出现
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,说明JVM支持的CipherSuite与License Server不匹配; - 若出现
Read timed out紧随*** ClientHello之后,证明ClientHello发出后,Server未返回ServerHello,问题在Server端或网络中间设备; - 若出现
Received fatal alert: handshake_failure,则是密钥协商失败,需检查JVM的java.security文件中jdk.tls.disabledAlgorithms配置。
第二步:验证JVM CipherSuite兼容性
IBM License Server当前(2024年)仅支持TLS 1.2,且要求CipherSuite为TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256或TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384。用以下命令检查JVM实际支持的套件:
# 进入WAS的JDK bin目录 cd /opt/ibm/java/jre/bin ./java -Djavax.net.debug=ssl:handshake -Dhttps.protocols=TLSv1.2 \ -cp /dev/null sun.security.ssl.Handshaker观察输出中Supported cipher suites:列表,确认是否包含上述两个GCM套件。若缺失,需升级JDK或修改jre/lib/security/java.security,移除TLS_ECDHE.*GCM.*相关的禁用条目。
第三步:抓包确认网络层行为
在WAS服务器执行:
tcpdump -i any -w license_handshake.pcap host licensing.ibm.com and port 443用Wireshark打开license_handshake.pcap,过滤tls.handshake.type == 1(ClientHello),观察:
- 是否有对应的
tls.handshake.type == 2(ServerHello)?若无,则License Server未响应,需联系IBM支持; - 若有ServerHello,但后续出现
tcp.analysis.lost_segment,则是防火墙或负载均衡器截断了TLS记录,需检查中间设备的TLS卸载配置。
实战经验:某央企项目中,超时报错持续存在。抓包发现ClientHello发出后,收到ServerHello,但紧接着是
tcp reset。最终定位为:数据中心防火墙启用了“TLS Inspection”功能,对licensing.ibm.com域名做了深度包检测,而IBM License Server的证书链包含私有CA,防火墙无法验证,故主动Reset连接。解决方案是:在防火墙白名单中放行licensing.ibm.com的443端口,禁用TLS Inspection。
5.3 永久解决方案:离线License激活与本地License Server
对于无法直连外网的生产环境,必须采用离线激活。流程如下:
- 在联网机器上,用
wsadmin.sh执行:$AdminTask exportLicenseKey {-fileName /tmp/was_license.key} - 将
/tmp/was_license.key拷贝至生产环境; - 在生产环境WAS Profile中,执行:
$AdminTask importLicenseKey {-fileName /opt/ibm/was_license.key} - 重启Dmgr,
SystemOut.log中出现License key imported successfully即生效。
更彻底的方案是部署本地IBM License Key Server(LKSD),通过lksd-config.xml配置指向本地地址,彻底规避外网依赖。这需要额外购买LKSD许可,但对金融、政务等强合规场景,是唯一可接受的方案。
6. 首次启动与验证:绕过adminconsole的静默健康检查
WAS首次启动成功,不等于部署完成。很多团队在startServer.sh server1返回ADMU3000I: Server server1 open for e-business后便宣告胜利,结果第二天发现应用无法访问。这是因为WAS的“启动成功”仅表示JVM进程存活,而真正的健康状态,需通过静默化脚本验证。
6.1 静默化验证清单:5个必须检查的端点
在startServer.sh server1执行后,立即运行以下检查(脚本化为was_health_check.sh):
Admin Console可达性(HTTP 9060):
curl -s -o /dev/null -w "%{http_code}" http://$(hostname -f):9060/ibm/console/login.jsp | grep -q "200" && echo "✅ AdminConsole OK" || echo "❌ AdminConsole DOWN"SOAP Connector可用性(SOAP 8880):
echo "listServers" | /opt/ibm/WebSphere/AppServer/bin/wsadmin.sh -lang jython -conntype SOAP -host $(hostname -f) -port 8880 2>/dev/null | grep -q "server1" && echo "✅ SOAP OK" || echo "❌ SOAP DOWN"JNDI命名服务响应(IIOP 2809):
timeout 5 sh -c 'echo > /dev/tcp/$(hostname -f)/2809' 2>/dev/null && echo "✅ IIOP OK" || echo "❌ IIOP DOWN"Node Agent心跳(Bootstrap 9810):
/opt/ibm/WebSphere/AppServer/bin/stopNode.sh 2>/dev/null; sleep 2; /opt/ibm/WebSphere/AppServer/bin/startNode.sh 2>/dev/null; sleep 5; ps aux | grep "NodeAgent" | grep -v grep && echo "✅ NodeAgent OK" || echo "❌ NodeAgent DOWN"JVM GC状态(避免内存泄漏):
jstat -gc $(pgrep -f "server1") | tail -1 | awk '{if ($3+$4 > 0.8*$2) print "❌ High Eden Usage"; else print "✅ GC OK"}'
注意:
wsadmin.sh的-conntype SOAP必须指定-host和-port,不能用localhost。因为WAS的SOAP Connector默认绑定到-hostName配置的FQDN,localhost会导致连接拒绝。
6.2 adminconsole登录失败的三大元凶
即使端口可达,http://host:9060/ibm/console仍可能报错。最常见原因:
- 浏览器缓存污染:
adminconsole的JavaScript资源有强缓存(Cache-Control: max-age=31536000)。若之前访问过旧版本WAS,浏览器会加载过期JS,导致登录框不渲染。解决方案:强制硬刷新(Ctrl+F5)或清除/ibm/console/路径下的所有Cookie; - JDK时区不一致:WAS服务器JDK时区为
GMT+0,而浏览器所在机器为GMT+8,adminconsole的CSRF Token校验因时间戳偏差超5分钟而失败。解决方案:在server.xml的<jvmEntries>中添加-Duser.timezone=Asia/Shanghai; - HTTPS重定向劫持:若WAS前端有F5或Nginx,且配置了
return 301 https://$host$request_uri;,而adminconsole的login.jsp未适配HTTPS,会导致无限重定向循环。解决方案:在F5上为/ibm/console/*路径禁用HTTPS重定向,或在WAS中配置com.ibm.ws.webcontainer.redirectHttps=true。
6.3 首次部署EAR包的避坑指南
部署第一个应用时,切忌直接上传大型EAR。我推荐分三步走:
部署最小化HelloWorld WAR(50KB以内):
- 内容仅为
index.jsp,输出<%= new java.util.Date() %>; - 部署时勾选“Precompile JSP files”和“Enable application security”;
- 验证URL:
http://host:9080/hello/index.jsp。
- 内容仅为
验证JNDI绑定: 在
WEB-INF/web.xml中添加:<resource-ref> <res-ref-name>jdbc/TestDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>然后在
ibm-web-bnd.xml中绑定:<resource-ref name="jdbc/TestDB" binding-name="jdbc/TestDB"/>此时部署会失败(因未配置JDBC Provider),但错误日志会清晰指出
JNDI name jdbc/TestDB not found,证明JNDI解析链路正常。部署真实EAR前,预检classloader: WAS的
classloader默认为PARENT_FIRST,易引发ClassNotFoundException。在ibm-application-bnd.xml中显式声明:<application-bnd> <classloader delegation="PARENT_LAST"/> </application-bnd>这确保应用自身的
lib/目录优先于WAS系统类库加载,解决Spring Boot嵌入式Tomcat与WAS冲突问题。
最后再分享一个小技巧:WAS的SystemOut.log默认只保留最近10MB,而首次启动的日志往往超过此限。在Logging and Tracing > server1 > Diagnostic Trace中,将Maximum file size调至100MB,并勾选Enable log file rotation,避免关键错误被覆盖。这个细节,能让80%的“启动失败但找不到日志”的问题迎刃而解。