在Mirth Connect中调用可执行Jar方法时找不到方法的问题
问题:Mirth Connect 3.12调用带依赖Jar时提示找不到方法
环境与正常场景
- 使用Mirth Connect 3.12版本
- 将无依赖、仅含简单打印功能的Jar上传至
custom-lib文件夹并重启Mirth后,通过以下脚本可正常调用Jar内方法:
var obj = new Packages.packagename.classname.method_name; logger.info(res);
异常场景
上传IntelliJ编译的带插件依赖的可执行Jar到custom-lib并重启Mirth后,执行调用脚本时抛出错误,错误日志如下:
[2022-07-22 03:26:15,176] ERROR (com.mirth.connect.server.util.javascript.JavaScriptUtil:522): Error executing Preprocessor script from channel: 15388747-57e4-46f7-bb0e-7da2d2c0ccbd
com.mirth.connect.server.MirthJavascriptTransformerException: SOURCE CODE:207: logger.info('Ended this -' + myCRC);208: 209: try{ 210: 211: /*212: var xyz = new java.io.File('\\\\WVMQTMCEDIAP01').getAbsolutePath();213: logger.info('Started -'+xyz);214: if(new java.io.File(xyz).exists()){215: logger.info('I am xyz available');216: }LINE NUMBER: 212DETAILS: TypeError: Cannot find function fileTransfer in object com.alpha.Smb@797b980d. at 15388747-57e4-46f7-bb0e-7da2d2c0ccbd_Preprocessor:212 (doScript) at 15388747-57e4-46f7-bb0e-7da2d2c0ccbd_Preprocessor:310 at com.mirth.connect.server.util.javascript.JavaScriptUtil.executeScript(JavaScriptUtil.java:547) at com.mirth.connect.server.util.javascript.JavaScriptUtil.executePreprocessorScripts(JavaScriptUtil.java:216) at com.mirth.connect.server.transformers.JavaScriptPreprocessor$JavaScriptPreProcessorTask.doCall(JavaScriptPreprocessor.java:103) at com.mirth.connect.server.util.javascript.JavaScriptTask.call(JavaScriptTask.java:113) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
解决方案
1. 修正Jar打包方式
IntelliJ默认生成的可执行Jar常采用依赖重命名或内部封装的方式,导致Mirth类加载器无法识别依赖类。需调整打包策略:
- 构建包含所有依赖的标准胖Jar(Fat Jar),保留依赖类的原始包路径,避免IntelliJ的自动重命名处理;
- 若依赖为独立Jar,将所有依赖Jar一同上传至
custom-lib文件夹,与业务Jar放在同一目录后重启Mirth。
2. 验证类加载路径
- 检查业务Jar的
MANIFEST.MF文件,确认Class-Path属性已正确声明所有依赖Jar的名称(若依赖为独立Jar); - 排查依赖Jar与Mirth自带库的版本冲突,比如避免与Mirth内置的Commons IO、Log4j等库版本不一致。
3. 修正脚本调用逻辑
错误提示显示com.alpha.Smb实例中找不到fileTransfer方法,需确认调用方式正确性:
- 若为实例方法,需先创建类实例再调用:
var smbObj = new Packages.com.alpha.Smb(); var result = smbObj.fileTransfer(); // 按需传入方法参数 logger.info(result); - 若为静态方法,直接通过类调用:
var result = Packages.com.alpha.Smb.fileTransfer(); // 按需传入方法参数 logger.info(result); - 检查方法参数签名是否匹配,确保传入参数的类型、数量与方法定义一致。
4. 调试类加载状态
可在Mirth脚本中加入调试代码,确认类及方法是否被正确加载:
try { var smbClass = Packages.com.alpha.Smb; logger.info("类加载成功: " + smbClass); // 打印类的所有公开方法 var methods = smbClass.getMethods(); for(var i=0; i<methods.length; i++){ logger.info("可用方法: " + methods[i].getName()); } } catch(e) { logger.error("类加载失败: " + e); }
内容的提问来源于stack exchange,提问作者user16379742
相关产品推荐
相关产品推荐

