1. EBS R12 Forms 焦点丢失到底卡在哪
EBS R12 的 Forms 界面在 JRE 升级后频繁出现焦点丢失,这个现象在 Oracle 社区里有个更形象的名字叫 Sticky Cursor。具体表现是鼠标点进某个字段,光标不出现,或者光标停在上一格不动,键盘 Tab 也切不过去,只能重新登录才恢复。11i 时代这个问题很少见,R12 之后概率明显上升,尤其是客户端 JRE 从 1.6 跳到 1.8 甚至更高版本之后。
这个问题的麻烦之处在于它不像报错那样有明确堆栈,Forms 客户端和中间层之间的交互是 Java Applet 或 Java Web Start 在跑,焦点管理依赖 AWT/Swing 的事件分发线程。JRE 版本一变,事件模型、DPI 缩放、输入法钩子的行为都可能跟着变,焦点就丢了。很多人第一反应是重启浏览器或者清缓存,但根因往往在 JRE 版本兼容性和 Forms 客户端参数配置上。
这篇内容面向的是正在维护 EBS R12 的 DBA 和 ERP 运维,我会从 JRE 版本排查入手,给出 Forms 客户端参数和配置文件的调整方法,再补一套用 TaoToken 统一管理接入 Key 的配置骨架,方便你在多环境调试时快速切换。整个排查过程可以跟着做,命令和配置都能直接复制。
2. 先确认 JRE 版本与 Forms 客户端的兼容关系
2.1 焦点丢失的典型触发条件
Sticky Cursor 的触发往往和这几个因素叠加有关:客户端 JRE 版本高于 Forms 服务端支持的版本区间、Java 控制面板里启用了高 DPI 缩放、输入法在 Applet 窗口外挂载了钩子、以及 Forms 的sun.java2d渲染参数没对齐。我实测下来,单纯升级 JRE 有时能缓解,但如果 Forms 服务端的formsweb.cfg没同步调整,问题会换个形式出现。
先确认你当前客户端跑的 JRE 版本。在 Windows 上打开命令行:
java -version输出里会显示类似java version "1.8.0_391"的信息。EBS R12.2 官方认证的 JRE 通常是 1.8 系列,但具体小版本有讲究,某些 update 版本对 AWT 焦点处理有回归。Oracle 的 Metalink 文档Diagnosing Forms Mouse Focus Problems Using JRE [ID 760250.1]里给了完整的调试思路,核心是先锁定 JRE 版本再谈参数。
2.2 检查 Forms 服务端的版本与补丁
在应用服务器上查 Forms 版本:
cd $ORACLE_HOME/forms grep -i "forms_version" $ORACLE_INSTANCE/config/FormsComponent/forms/server/formsweb.cfg或者直接看$ORACLE_HOME/forms/lib下的 jar 版本。R12.2 的 Forms 是 10.1.2.3 系列,如果补丁没打全,焦点问题在特定 JRE 上会稳定复现。建议对照 Oracle 的补丁推荐列表,把 Forms 的 CPU 补丁打到最新。
2.3 用最小复现步骤确认根因
在动配置之前,先做一次干净的复现。关掉所有浏览器窗口,清掉 Java 缓存:
javaws -uninstall然后重新打开 EBS Forms,登录后立刻测试:鼠标点第一个字段,再点第二个字段,观察光标是否跟随。如果第一次就丢,说明是 JRE 和 Forms 的初始化握手问题;如果操作几分钟后才丢,更可能是事件队列或输入法钩子的问题。把这个复现结果记下来,后面调参数时用来对比。
3. TaoToken 前置:统一 Key 与配置骨架
3.1 为什么排查场景需要 TaoToken
EBS Forms 的调试经常要在多个环境之间切换,比如测试库、预生产、生产,每个环境可能对应不同的模型服务或 API 端点。如果每个环境都手动改 Key 和地址,排查过程本身就会引入变量。TaoToken 的作用是把这些接入信息收敛成一份配置,用统一的 Key 管理,切换环境时只改一个字段。
TaoToken 的 API 地址是https://taotoken.net/api,官网在https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。你可以在控制台里创建 Key,然后把它写进下面的配置文件骨架。
3.2 config.toml 骨架
这份config.toml适合放在项目根目录,用来管理调试环境的接入参数:
# TaoToken 接入配置骨架 [default] api_base = "https://taotoken.net/api" api_key = "sk-your-taotoken-key" timeout_ms = 30000 [ebs_debug] # EBS Forms 调试专用环境 api_base = "https://taotoken.net/api" api_key = "sk-your-taotoken-key" model = "claude-sonnet" max_tokens = 4096 [ebs_prod] api_base = "https://taotoken.net/api" api_key = "sk-your-taotoken-key" model = "claude-sonnet" max_tokens = 8192api_base统一指向 TaoToken 的 API 入口,api_key从控制台获取。不同 section 对应不同环境,排查时只切换 section 名即可。
3.3 settings.json 骨架
如果你的调试工具链走 JSON 配置,用这份settings.json:
{ "taotoken": { "api_base": "https://taotoken.net/api", "api_key": "sk-your-taotoken-key", "default_model": "claude-sonnet", "timeout_ms": 30000 }, "ebs_forms": { "jre_version": "1.8.0_391", "forms_version": "10.1.2.3", "focus_debug": true, "log_level": "DEBUG" } }focus_debug打开后,Forms 客户端会把焦点事件写进日志,方便对照 JRE 版本变化。jre_version字段记录当前测试的 JRE,改版本时同步更新,避免排查记录混乱。
拿到 Key 的入口在控制台的 API Keys 页面,接入文档在 doc 页面,模型对话调试可以用模型对话入口。这几个地址都带统一的 utm 参数,方便你从排查场景直接跳转。
4. 可复制配置:Forms 客户端参数与 JRE 调优
4.1 formsweb.cfg 关键参数
在应用服务器上编辑formsweb.cfg,重点调整这几个参数:
# 强制使用特定 JRE 版本 jpi_classid=clsid:CAFEEFAC-0018-0000-FFFF-ABCDEFFEDCBA jpi_mimetype=application/x-java-applet;jpi-version=1.8.0_391 # 关闭高 DPI 缩放,避免焦点偏移 java_plugin_parameters=-Dsun.java2d.dpiaware=false # 调整 AWT 事件队列 java_plugin_parameters=-Dsun.awt.keepWorkingSetOnMinimize=true # 禁用输入法钩子干扰 java_plugin_parameters=-Djava.awt.im.style=on-the-spotsun.java2d.dpiaware=false这一条对高分辨率屏幕下的焦点丢失特别有效,因为 DPI 缩放会让鼠标坐标和控件坐标对不上,光标就飘了。java.awt.im.style=on-the-spot是让输入法在 Applet 内部处理,减少外部钩子抢焦点。
4.2 客户端 Java 控制面板设置
在客户端机器上打开 Java 控制面板,进入 Java 选项卡,把运行时版本锁定到认证过的 JRE。然后在高级选项卡里:
调试 -> 启用跟踪 -> 勾选 调试 -> 启用日志记录 -> 勾选 Java 控制台 -> 显示控制台 -> 勾选这样焦点事件会输出到 Java 控制台,复现时能直接看到 AWT 的焦点转移日志。如果日志里出现FocusLost和FocusGained频繁交替,基本可以确认是事件队列被外部钩子打断。
4.3 用 TaoToken 配置驱动调试脚本
把前面的config.toml接进调试脚本,用统一 Key 拉取模型做日志分析:
import tomllib import requests with open("config.toml", "rb") as f: config = tomllib.load(f) env = config["ebs_debug"] headers = { "Authorization": f"Bearer {env['api_key']}", "Content-Type": "application/json" } payload = { "model": env["model"], "max_tokens": env["max_tokens"], "messages": [ {"role": "user", "content": "分析以下 Forms 焦点日志,找出 FocusLost 异常模式"} ] } resp = requests.post(f"{env['api_base']}/v1/messages", json=payload, headers=headers) print(resp.json())这段脚本把 Java 控制台导出的焦点日志喂给模型,快速定位异常模式。api_base和api_key都从 TaoToken 配置里读,换环境只改config.toml的 section。
5. 验证请求与成功结果
5.1 验证 TaoToken 接入是否通
先用一个最小请求确认 Key 和地址可用:
curl -X POST https://taotoken.net/api/v1/messages \ -H "Authorization: Bearer sk-your-taotoken-key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet", "max_tokens": 128, "messages": [{"role": "user", "content": "ping"}] }'返回里如果有content字段和正常的文本,说明接入没问题。如果返回 401,检查 Key 是否复制完整;返回 404,检查api_base是否漏了/api。
5.2 验证 Forms 焦点是否恢复
改完formsweb.cfg后重启 Forms 服务:
$ORACLE_INSTANCE/bin/opmnctl restartproc process-type=Forms然后在客户端清 Java 缓存,重新登录 EBS。测试步骤:
第一步,鼠标点击第一个输入字段,确认光标出现。第二步,不按 Tab,直接用鼠标点第二个字段,确认光标跳过去。第三步,连续快速点击五个字段,观察是否有一次丢焦点。第四步,打开 Java 控制台,看焦点日志里FocusLost是否只在切换窗口时出现,而不是在字段间点击时出现。
如果四步都通过,说明 JRE 参数和 Forms 配置对齐了。我实测下来,dpiaware=false加上锁定 JRE 小版本,能把复现概率从每天几次降到几乎不出现。
5.3 记录验证结果
把每次验证的 JRE 版本、Forms 补丁号、formsweb.cfg参数快照存进一份记录,格式参考:
{ "test_date": "2025-01-15", "jre_version": "1.8.0_391", "forms_patch": "CPU202410", "dpiaware": false, "im_style": "on-the-spot", "focus_loss_count": 0, "notes": "连续点击 50 次无丢失" }这份记录在后续换 JRE 或打补丁时能快速对比,避免重复踩坑。
6. 本篇常见错排查
6.1 改了 formsweb.cfg 但没生效
最常见的原因是改错了文件。R12.2 的 Forms 配置在$ORACLE_INSTANCE/config/FormsComponent/forms/server/formsweb.cfg,不是$ORACLE_HOME/forms/server下的那份。改完必须重启 Forms 组件,只重启 OHS 不够。另外,客户端如果缓存了旧的 jar,参数不会更新,记得javaws -uninstall清缓存。
6.2 JRE 版本降了但焦点还是丢
如果降 JRE 后问题依旧,检查是不是有多个 JRE 共存,浏览器实际调用的是另一个版本。在 Java 控制面板里看「已安装的 Java 运行时」列表,把不用的版本禁用。另外,Windows 的 PATH 里如果 java 指向了别的版本,命令行验证会误导你,用where java确认实际路径。
6.3 TaoToken 请求返回 401 或 403
先确认 Key 没有多余空格,Authorization头格式是Bearer sk-xxx。如果 Key 是从控制台复制的,注意有些浏览器会带上换行符。403 通常是 Key 权限不足,去控制台的 API Keys 页面检查这个 Key 是否绑定了正确的模型权限。接入文档里有完整的错误码对照。
6.4 焦点日志里全是 FocusLost 但界面正常
这种情况可能是输入法在后台频繁抢焦点,日志噪音大但不影响使用。把java.awt.im.style设成on-the-spot后,日志会干净很多。如果日志里FocusLost和FocusGained成对出现且间隔小于 100ms,基本是输入法钩子,不用管。
6.5 高 DPI 屏幕下光标偏移
除了dpiaware=false,还要在 Windows 的兼容性设置里,把浏览器和 Java 的可执行文件都设为「替代高 DPI 缩放行为」,缩放执行选「应用程序」。这样系统不再对 Java 窗口做二次缩放,鼠标坐标和控件坐标就对齐了。
排查到这一步,如果焦点问题还在,建议把 Java 控制台的完整日志和formsweb.cfg快照一起提交给 Oracle Support,附上 Metalink 文档 ID 760250.1 的调试步骤记录,能加快定位。日常维护里,把 JRE 版本和 Forms 补丁的对应关系锁死,别让客户端自动更新 JRE,是预防 Sticky Cursor 最省事的办法。