【本回复由 AI 根据产品文档自动生成】
你好,关于 jar 包中 class 无法实例化、报 `NativeJavaPackage` 错误的问题,下面给出完整排查方案。
## 一、错误根因
报错关键:
```
TypeError: [JavaPackage com.hg.pdfhelper.PdfFileUtil] is not a function,
it is org.mozilla.javascript.NativeJavaPackage
```
含义:Rhino 引擎把 `com.hg.pdfhelper.PdfFileUtil` **当成了一个 Java 包(package),而不是一个类(class)**。说明这个类**没有被 JVM 加载**,Rhino 找不到对应类,于是 fallback 成了 NativeJavaPackage。
## 二、最常见 4 类原因
### 1. jar 包没真正加载(最常见)
- 你把 jar 放到了 `webapps/obpm/WEB-INF/lib`,但**没有重启 Tomcat**
- Tomcat 启动时才扫描 lib 目录,运行时丢进去不会自动加载
- **必须停 Tomcat → 放 jar → 启 Tomcat**
### 2. 类路径冲突或被覆盖
- 同名 class 在多个 jar 中存在(如 `PdfFileUtil` 在其他依赖中也定义了)
- `WEB-INF/lib` 下存在老版本同包名 jar
### 3. 包名/类名大小写不匹配
- Java 包名、类名**严格区分大小写**
- 你的代码 `Packages.com.hg.pdfhelper.PdfFileUtil`,请确认:
- 实际包名是不是 `com.hg.pdfhelper`?
- 实际类名是不是 `PdfFileUtil`(首字母大写、拼写一致)?
- 反编译 jar 用 jd-gui 或 IDEA 查看 `PdfFileUtil.class` 实际所在包名
### 4. 缺无参构造函数
- 你的类没有 `public PdfFileUtil()` 无参构造方法
- `new Packages.xxx()` 实际调用了无参构造,没有就会失败
## 三、推荐验证步骤
1. **确认 jar 是否加载**:
```bash
# Tomcat 启动后,看日志是否扫描到该 jar
# 或写一个测试脚本
var pkg = Packages.com.hg.pdfhelper;
println(pkg); // 如果是 [JavaPackage com.hg.pdfhelper] 则未加载
```
2. **重启 Tomcat**(最重要)
```bash
# 停止
bin/shutdown.sh
# 确认进程退出
ps -ef | grep java
# 启动
bin/startup.sh
```
3. **反编译确认包名类名**
4. **改用反射调用**,规避 Rhino 直接 new 的限制:
```javascript
var clazz = java.lang.Class.forName("com.hg.pdfhelper.PdfFileUtil");
var constructor = clazz.getConstructor([]);
var instance = constructor.newInstance([]);
var method = clazz.getMethod("mulFile2One", [java.util.List, java.lang.String]);
var result = method.invoke(instance, [files, targetPath]);
```
## 四、补充建议
- **不要把 jar 直接丢到 `WEB-INF/lib`**:平台升级、补丁覆盖时极易丢失
- 推荐做法:放到平台的「外部依赖目录」(`obpm/WEB-INF/ext-lib` 或 `domain-lib`),不同版本目录名略有差异
- 或把自定义 jar 注册成平台「库函数」,在「后台 → 库函数」中调用,避免脚本散落
## 五、需要补充的信息
- jar 是否真正重启 Tomcat 后才放入
- PdfFileUtil 类的反编译截图(包名、构造函数、mulFile2One 方法签名)
- 服务器端 `catalina.out` 启动日志中是否有 ClassNotFoundException
参考文档:
http://docs.myapps.cn/
http://docs.myapps.cn/quick-start/dev-script/
把上面的信息补一下,可以更精准地判断到底是哪一类问题。 |