ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

T100 ERP 挂载 jar 包实战:CLASSPATH 配置与 4GL 调用避坑指南

T100 ERP 挂载 jar 包实战:CLASSPATH 配置与 4GL 调用避坑指南

简介:这份文档面向使用鼎捷T100 ERP系统的开发与实施人员,聚焦于在T100环境中导入外部jar包并调用其中方法这一常见需求。内容围绕Java与4GL混合开发场景展开,适合具备一定T100二次开发基础、需要扩展系统功能的工程师参考。资源包内仅含1个docx文档,大小约500KB,以图文步骤形式记录关键操作要点,便于对照实践。文档涉及通过XFTP上传jar包、调整CLASSPATH参数、重新连接ERP系统后import引入、实例化对象并调用方法等环节,并特别记录了create方式报错后改用jar包内静态getInstance方法返回实例的替代思路,同时附有jar包内容说明与执行结果验证。目前已有1223人学习,可为遇到同类调用问题的开发者提供排错方向与实现参考。

1. T100 引入 jar 包这件事,版本和路径先对齐再动手

第一次在 T100 里挂 jar 包,我踩的坑不是代码写错,而是路径和 CLASSPATH 没对齐。T100 是鼎捷 tiptop 体系里跑 4GL 的那一层,底层还是 JAVA 在扛,所以想在 4GL 里调一个现成的 jar 方法,本质上就是让 T100 的 JAVA 运行时能“看见”这个包。听起来简单,但 T100 的环境不像普通 Tomcat 项目,你把 jar 往 lib 里一丢就完事——它有自己的 CLASSPATH 参数、有自己的服务重连机制,还有 4GL 那边 import 的写法约束。装不好会怎样?轻则 import 报找不到类,重则整个 ERP 连接起不来,业务那边直接炸锅。这篇适合两类人:一类是刚接手 T100 二次开发、第一次往里面塞 jar 的开发者;另一类是老手但换了个 T100 版本,发现以前那套路径不灵了,想找一份能照着走的落地记录。下面按“放包 → 改 CLASSPATH → 重连 → import → 调用 → 验证”的顺序拆开讲,中间会重点说那个 create 出错的玄学问题,以及我最后怎么绕过去的。

2. 放包与改 CLASSPATH:T100 识别 jar 的两步硬操作

2.1 用 XFTP 把 jar 传到 T100 的指定路径

T100 跑在 Linux 环境里,传文件最顺手的就是 XFTP。我一般会先确认目标路径,常见做法是放在 T100 的lib或者classes同级目录下,具体看你们那套 tiptop 的部署结构。别随便丢/tmp,因为服务重连后不一定扫得到。操作步骤:

  1. 打开 XFTP,连上 T100 所在的那台服务器。
  2. 左侧本地找到你编译好的 jar,右侧切到 T100 的 JAVA 扩展目录,比如/u1/tiptop/lib这种层级(以你们实际部署为准)。
  3. 直接拖过去,或者用上传按钮。传完在 XFTP 里看一眼文件大小对不对,别传了个 0 字节的上去。
# 传完后登录服务器确认文件在位,顺便看权限 ls -l /u1/tiptop/lib/your-tool.jar # 常见做法是把属主和权限对齐同目录其他 jar chown tiptop:tiptop /u1/tiptop/lib/your-tool.jar chmod 644 /u1/tiptop/lib/your-tool.jar

逻辑说明:ls -l是确认文件真的落地了,不是 XFTP 显示成功就完事。chown和chmod这两步很多人会漏,结果服务重连后读不到,报的却是“类找不到”,方向直接跑偏。参数上,属主一般跟同目录其他 jar 保持一致,权限 644 足够,别给 777,没必要也不安全。

提示:传之前先确认 jar 是用哪个 JDK 版本编译的。T100 那边如果是 JDK 1.8,你拿 JDK 17 编出来的包,放进去也是白放,重连直接给你颜色看。

2.2 修改 CLASSPATH 参数,让 T100 的 JAVA 认得这个包

包放进去了,但 T100 的 JAVA 运行时不一定知道去那儿找。这时候要改 CLASSPATH。T100 里这个参数通常在启动脚本或者环境配置文件里,常见做法是找setenv或者tiptop相关的 profile 文件。你要做的是把刚才那个 jar 的完整路径追加进去。

# 先找到当前 CLASSPATH 是在哪个文件里定义的 grep -r "CLASSPATH" /u1/tiptop/ --include="*.sh" --include="*.profile" 2>/dev/null # 假设定位到 /u1/tiptop/bin/setenv.sh,编辑它 vi /u1/tiptop/bin/setenv.sh # 在 CLASSPATH 那一行末尾追加 jar 路径,注意用冒号分隔 # 改前:export CLASSPATH=$CLASSPATH:/u1/tiptop/lib/existing.jar # 改后:export CLASSPATH=$CLASSPATH:/u1/tiptop/lib/existing.jar:/u1/tiptop/lib/your-tool.jar

逻辑说明:grep -r是为了不靠记忆瞎找,T100 不同版本放 CLASSPATH 的位置不一样,有的在setenv,有的在profile,搜一遍最稳。追加的时候注意是冒号分隔,Linux 下 CLASSPATH 用:,Windows 才用;,这个搞反了就是经典翻车现场。改完保存,别急着重启整个 ERP,先往下走重连步骤。

参数说明:$CLASSPATH是保留原有配置,别直接覆盖,覆盖了原有 jar 全失效,那就不只是你的包调不到,整个 T100 都可能出问题。追加的路径必须是绝对路径,相对路径在服务启动时的工作目录下大概率找不到。

注意:改配置文件前先备份一份,cp setenv.sh setenv.sh.bak,改坏了还能滚回来。这是血泪经验,别问我是怎么知道的。

3. 重连 ERP 与 import:让 4GL 那边能认出你的类

3.1 重新连接 ERP 系统,触发 CLASSPATH 重新加载

CLASSPATH 改完,T100 不会自动感知,你得让它重新连一次。常见做法是重启 T100 的 JAVA 服务,或者通过 ERP 的管理界面做一次重连。具体命令看你们部署方式,有的用tiptop restart,有的直接kill掉进程再拉起来。

# 先看 T100 相关进程 ps -ef | grep tiptop | grep -v grep # 常见做法是走服务脚本重启,别直接 kill -9 /u1/tiptop/bin/tiptop restart # 重启后确认进程起来了 ps -ef | grep tiptop | grep -v grep

逻辑说明:ps -ef先确认进程名,别对着一个不存在的服务瞎重启。用服务脚本 restart 比 kill -9 温和,kill -9 有时候会留下锁文件或者半截状态,下次启动反而起不来。重启完再ps一遍,确认进程真的在,不是脚本执行完就完事了。

重连之后,T100 的 JAVA 运行时才会重新读 CLASSPATH,这时候你的 jar 才算真正被“挂”上去。如果这步跳过,后面 import 报找不到类,你会以为是 jar 没传对,其实是 CLASSPATH 没生效。

3.2 在 4GL 里 import jar 包并实例化对象

环境层面搞定后,进到 4GL 代码里。T100 的 4GL 调 JAVA 类,写法上跟标准 JAVA 不太一样,但 import 的逻辑是一致的:先声明你要用哪个包,再实例化,再调方法。

// 4GL 里 import 的写法,包名跟你 jar 里的 package 一致 import com.yourcompany.tool.YourClass; // 然后实例化 DEFINE obj YourClass LET obj = YourClass.create()

逻辑说明:import那行必须跟 jar 里实际的 package 路径完全对上,大小写敏感。DEFINE是 4GL 里声明变量,YourClass就是你 jar 里的类名。create()是 T100 4GL 里常见的实例化方式,但这里就是那个玄学坑——我这边create会出错,报的错还特别模糊,不是“找不到方法”就是“实例化失败”,查半天查不出所以然。

3.3 create 出错后的绕行方案:static getInstance

create走不通,我最后是在 jar 包里加了一个 static 的getInstance方法,返回一个实例化好的对象。这个做法相当于把实例化的活儿从 4GL 那边挪到 JAVA 那边,4GL 只负责拿现成的。

// jar 包里的 JAVA 代码,加一个静态工厂方法 public class YourClass { private static YourClass instance; public static YourClass getInstance() { if (instance == null) { instance = new YourClass(); } return instance; } // 你原本要调用的业务方法 public String yourMethod(String input) { return "processed: " + input; } }

逻辑说明:getInstance是 static 的,4GL 那边不需要先实例化就能直接调。instance用懒加载,第一次调用时才 new,后面复用同一个对象。这样 4GL 里就变成:

// 4GL 里改成这样调 DEFINE obj YourClass LET obj = YourClass.getInstance() DISPLAY obj.yourMethod("test")

参数说明:getInstance返回的是YourClass类型,4GL 那边DEFINE的类型要对上。yourMethod是你实际要用的业务方法,参数和返回值按你 jar 原本的设计来。这个绕行方案的好处是避开了 4GLcreate那个不确定的行为,坏处是如果你的类需要带参构造,得在getInstance里把参数处理好,或者再加一个带参的静态方法。

提示:改完 jar 记得重新编译,重新用 XFTP 传上去,再走一遍重连。别改了本地没传,然后对着旧包调半天。

4. 避坑与排查:T100 挂 jar 最常见的五个翻车点

4.1 现象:import 报找不到类,但 jar 明明在

原因:CLASSPATH 没生效,或者 jar 路径写错了。T100 重连后才会重新读 CLASSPATH,改完不重连等于没改。另一个可能是 jar 传上去了但权限不对,JAVA 进程读不到。

解决:先ps -ef确认服务真的重启了,再ls -l看 jar 权限,最后grep CLASSPATH确认路径拼写。三步走完基本能定位。

4.2 现象:create 实例化报错,错误信息模糊

原因:T100 4GL 的create对某些类构造方式支持不好,尤其是带参构造或者依赖注入的类。这个坑我查了很久,最后放弃create走 static 工厂。

解决:在 jar 里加getInstance静态方法,4GL 那边改成YourClass.getInstance()。如果类必须带参,就再加一个getInstanceWithParams(String p1)这种静态方法。

4.3 现象:重连后 T100 起不来,业务全断

原因:CLASSPATH 改错了,比如覆盖了原有配置,或者路径里多了空格、少了冒号。JAVA 启动时解析 CLASSPATH 失败,整个服务拉不起来。

解决:立刻用备份的setenv.sh.bak还原,重启服务。改 CLASSPATH 时养成习惯:先echo $CLASSPATH看当前值,改完再echo一遍确认拼接正确。

4.4 现象:jar 传上去了,但 4GL 里 import 的包名对不上

原因:jar 里的 package 路径和 4GL 里 import 的写法不一致。比如 jar 里是com.company.tool,4GL 里写成com.company.Tool,大小写一差就找不到。

解决:用jar tf your-tool.jar看一眼包结构,确认 package 全小写还是驼峰,4GL 里严格照抄。

# 查看 jar 内部结构,确认包名和类名 jar tf /u1/tiptop/lib/your-tool.jar | head -20

4.5 现象:调用方法时参数类型不匹配,运行时报错

原因:4GL 和 JAVA 的类型系统不一样,比如 JAVA 那边要int,4GL 传了个字符串;或者 JAVA 返回List,4GL 那边不知道怎么接。

解决:在 jar 那层做一层适配,把复杂类型转成 String 或者基本类型再返回。4GL 调 JAVA 尽量走简单类型,别直接传集合或者自定义对象,容易出玄学问题。

5. 装完怎么验证:从 import 到执行结果走一遍闭环

验证这件事,我一般不走“看起来没问题”这种主观判断,而是走一个最小闭环:传包 → 改 CLASSPATH → 重连 → import → 调方法 → 看输出。每一步都有可观察的结果,哪一步断了立刻能定位。

先确认 jar 在位且权限正确:

ls -l /u1/tiptop/lib/your-tool.jar # 期望输出类似:-rw-r--r-- 1 tiptop tiptop 12345 Jan 1 10:00 your-tool.jar

再看 CLASSPATH 里有没有你的包:

# 在 T100 的环境里执行,或者 source 一下 setenv 再 echo source /u1/tiptop/bin/setenv.sh echo $CLASSPATH | tr ':' '\n' | grep your-tool # 期望输出:/u1/tiptop/lib/your-tool.jar

然后进 4GL 写一段最小调用代码,别一上来就调业务方法,先调一个返回固定字符串的方法,确认链路通了:

// 4GL 最小验证代码 import com.yourcompany.tool.YourClass; DEFINE obj YourClass DEFINE result STRING LET obj = YourClass.getInstance() LET result = obj.yourMethod("hello") DISPLAY result

期望输出是processed: hello这种你能预期的结果。如果DISPLAY出来了,说明从 jar 加载到方法调用整条链路是通的。如果报错,按第 4 章的排查顺序倒着查:先看 import 有没有报错,再看getInstance能不能拿到对象,最后看方法调用。

我还会额外做一步:把 T100 服务重启一次,再跑一遍上面的验证。因为有些环境是“当前会话能调,重启后就失效”,根因还是 CLASSPATH 没写进持久化配置,只是临时 export 了一下。重启后还能跑通,才算真的装好了。

下面这张表是我自己排查时用的对照,贴在工位上省得每次重新想:

验证步骤命令/操作期望结果失败时先看
jar 在位ls -l目标路径文件存在,权限 644XFTP 是否传完
CLASSPATH 包含echo $CLASSPATH路径在列表里setenv 是否保存
服务重连ps -ef进程存在重启脚本是否报错
import 通过4GL 编译无报错包名大小写
实例化通过getInstance()返回对象非空静态方法是否编译进 jar
方法调用DISPLAY输出预期字符串参数类型是否匹配

从那以后我每次往 T100 里挂新 jar,都强制走一遍这个闭环,不跳步。跳一步当时省两分钟,后面排查花两小时,不划算。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表