找回密码
 注册成为天翎用户
查看: 672|回复: 1

[已解决] jar包中class无法实例化调用

[复制链接]
visual 发表于 2020-6-17 19:03:50 | 显示全部楼层 |阅读模式
【myApps/OBPM版本号】:myAppsSetup_V4.4sp18.exe
联系QQ:2321399971
问题:
新建maven项目 编译为jar包,放入D:\MyApps\bin\apache-tomcat-8.5.47\webapps\obpm\WEB-INF\lib 下



后台建立库函数,调用jar包代码:

var mergePdf =new  Packages.com.hg.pdfhelper.PdfFileUtil();
var f = mergePdf.mulFile2One(files, targetPath);

执行报错
org.mozilla.javascript.EcmaError: TypeError: [JavaPackage com.hg.pdfhelper.PdfFileUtil] is not a function, it is org.mozilla.javascript.NativeJavaPackage. (__O4zjIOEppWeC2USBVix).合并test.beforeActionScript#4)

检查jdk版本:与服务器一致为jdk 1.8.0_65

谁可以告知一下啊?
1592378497(1).jpg
admin 发表于 5 天前 | 显示全部楼层
【本回复由 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/

把上面的信息补一下,可以更精准地判断到底是哪一类问题。

本版积分规则

手机版|天翎MyApps技术社区 ( 粤ICP备11093750号 )

GMT+8, 2026-8-19 21:16

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表