Mac终端运行jar报java.lang.UnsatisfiedLinkError如何解决
问题背景
需要在Mac终端通过命令行运行myApp.jar,该jar包在Linux服务器可正常运行,Mac端执行时抛出如下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: while loading kognac-core: Stream closed at karmaresearch.vlog.VLog.loadLibrary(VLog.java:72) at karmaresearch.vlog.VLog.<clinit>(VLog.java:22) at org.semanticweb.rulewerk.reasoner.vlog.VLogReasoner.<init>(VLogReasoner.java:82) at org.semanticweb.rulewerk.client.picocli.MyApp.someMethod(MyApp.java:150) at org.semanticweb.rulewerk.client.picocli.MyApp.main(MyApp.java:110)
相关环境与已尝试操作如下:
- 初始运行命令:
java -jar myApp.jar注:原命令中写为
java -jar myApp.java属于笔误,jar包运行命令后缀应为.jar - 打包环境:jar包在Mac设备上通过Eclipse使用JavaSE 1.8编译打包生成
- 版本信息:
- Linux服务器Java版本:
openjdk version "1.8.0_292" - Mac端共安装3个Java版本:默认版本
Java SE 11.0.1、1.8.0_202、1.8.0_201
- Linux服务器Java版本:
- 已尝试操作:分别调用3个Java版本运行jar包,命令如下,均抛出相同错误
/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/bin/java -jar myApp.jar /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/bin/java -jar myApp.jar
故障原因
该报错和JDK版本无关,本质是平台原生依赖缺失:项目使用的Rulewerk VLog推理引擎依赖kognac-core原生本地库,不同操作系统需要对应格式的库文件(Linux为.so、Mac为.dylib、Windows为.dll),你当前打出的jar包仅内置了Linux平台的库文件,没有包含Mac平台对应的dylib文件,因此JVM无法加载对应库触发报错。
修复步骤
- 补全Mac平台原生依赖
- 若使用Maven管理项目,在pom.xml中添加Mac平台对应的VLog原生依赖,注意版本号必须和你当前使用的rulewerk核心包版本完全一致:
<dependency> <groupId>org.semanticweb.rulewerk</groupId> <artifactId>rulewerk-vlog-native-macos</artifactId> <version>替换为你实际使用的rulewerk版本</version> </dependency> - 若使用Eclipse手动导入jar包,直接下载同版本的
rulewerk-vlog-native-macosjar包,加入项目构建路径即可。
- 若使用Maven管理项目,在pom.xml中添加Mac平台对应的VLog原生依赖,注意版本号必须和你当前使用的rulewerk核心包版本完全一致:
- 重新通过Eclipse导出可运行jar包,优先使用本地安装的JDK8版本运行,不要使用JDK11:
/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/bin/java -jar myApp.jar - 如果运行时提示dylib库无开发者签名无法打开,执行以下命令移除Mac系统对未签名原生库的隔离限制,之后重新运行jar包即可:
sudo xattr -r -d com.apple.quarantine /tmp/vlog*
内容的提问来源于stack exchange,提问作者sysSTD
相关产品推荐
相关产品推荐

