Mac环境下Java调用IBM CPLEX无法找到本地库求助
Mac下调用IBM CPLEX Java程序时UnsatisfiedLinkError问题解决
在Mac上运行调用IBM CPLEX的Java程序,能识别CPLEX的JAR包,但始终无法加载本地实现库,抛出UnsatisfiedLinkError异常。
测试代码
import ilog.cplex.IloCplex; public class CPLEXTester { public static void main(String[] args) { System.out.println(System.getProperty("java.library.path")); try { new IloCplex(); } catch(Exception e) { e.printStackTrace(); } } }
IntelliJ运行输出
/Users/bradley/Library/Java/JavaVirtualMachines/openjdk-18.0.1.1/Contents/Home/bin/java -Dvisualvm.id=27090629736541 -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=63865:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/bradley/Desktop/code/cplexTester/out/production/cplexTester:/Users/bradley/Desktop/code/adaje/code/lib/java/cplex-12.9.jar CPLEXTester /Users/bradley/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. java.lang.UnsatisfiedLinkError: no cplex1290 in java.library.path: /Users/bradley/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. java.library.path must point to the directory containing the CPLEX shared library try invoking java with java -Djava.library.path=... Exception in thread "main" java.lang.UnsatisfiedLinkError: 'long ilog.cplex.Cplex.CPXopenCPLEX(int[])' at ilog.cplex.Cplex.CPXopenCPLEX(Native Method) at ilog.cplex.CplexI.init(CplexI.java:7083) at ilog.cplex.CplexI.<init>(CplexI.java:856) at ilog.cplex.IloCplex.<init>(IloCplex.java:12042) at ilog.cplex.IloCplex.<init>(IloCplex.java:12057) at CPLEXTester.main(CPLEXTester.java:7)
已尝试的操作
- 将CPLEX本地库文件
libcplex1290.jnilib和libcplex1290.dylib放在/Library/Java/Extensions目录,该路径已包含在java.library.path中 - 显式指定
java.library.path运行命令:
java -Djava.library.path=/Library/Java/Extensions -cp ~/Desktop/code/lib/java/cplex-12.9.jar CPLEXTester.java
- 尝试直接加载库:
public class CPLEXTester { public static void main(String[] args) { System.load("/Library/Java/Extensions/libcplex1290.jnilib"); } }
运行后依然抛出错误:
/Users/bradley/Library/Java/JavaVirtualMachines/openjdk-18.0.1.1/Contents/Home/bin/java -Dvisualvm.id=27158373972541 -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=63876:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/bradley/Desktop/code/cplexTester/out/production/cplexTester:/Users/bradley/Desktop/code/adaje/code/lib/java/cplex-12.9.jar CPLEXTester Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /Library/Java/Extensions/libcplex1290.jnilib at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2398) at java.base/java.lang.Runtime.load0(Runtime.java:785) at java.base/java.lang.System.load(System.java:1979) at CPLEXTester.main(CPLEXTester.java:5)
系统及Java配置
java -XshowSettings:properties -version Property settings: file.encoding = UTF-8 file.separator = / ftp.nonProxyHosts = local|*.local|169.254/16|*.169.254/16 http.nonProxyHosts = local|*.local|169.254/16|*.169.254/16 java.class.path = java.class.version = 62.0 java.home = /Users/bradley/Library/Java/JavaVirtualMachines/openjdk-18.0.1.1/Contents/Home java.io.tmpdir = /var/folders/6w/qsmx4xpn7vs528v_7qvm_k9m0000gq/T/ java.library.path = /Users/bradley/Library/Java/Extensions /Library/Java/Extensions /Network/Library/Java/Extensions /System/Library/Java/Extensions /usr/lib/java . java.runtime.name = OpenJDK Runtime Environment java.runtime.version = 18.0.1.1+2-6 java.specification.name = Java Platform API Specification java.specification.vendor = Oracle Corporation java.specification.version = 18 java.vendor = Oracle Corporation java.vendor.url = https://java.oracle.com/ java.vendor.url.bug = https://bugreport.java.com/bugreport/ java.version = 18.0.1.1 java.version.date = 2022-04-22 java.vm.compressedOopsMode = Zero based java.vm.info = mixed mode, sharing java.vm.name = OpenJDK 64-Bit Server VM java.vm.specification.name = Java Virtual Machine Specification java.vm.specification.vendor = Oracle Corporation java.vm.specification.version = 18 java.vm.vendor = Oracle Corporation java.vm.version = 18.0.1.1+2-6 jdk.debug = release line.separator = \n native.encoding = UTF-8 os.arch = aarch64 os.name = Mac OS X os.version = 12.4 path.separator = : socksNonProxyHosts = local|*.local|169.254/16|*.169.254/16 sun.arch.data.model = 64 sun.boot.library.path = /Users/bradley/Library/Java/JavaVirtualMachines/openjdk-18.0.1.1/Contents/Home/lib sun.cpu.endian = little sun.io.unicode.encoding = UnicodeBig sun.java.launcher = SUN_STANDARD sun.jnu.encoding = UTF-8 sun.management.compiler = HotSpot 64-Bit Tiered Compilers sun.stderr.encoding = UTF-8 sun.stdout.encoding = UTF-8 user.country = US user.dir = /Users/bradley user.home = /Users/bradley user.language = en user.name = bradley openjdk version "18.0.1.1" 2022-04-22 OpenJDK Runtime Environment (build 18.0.1.1+2-6) OpenJDK 64-Bit Server VM (build 18.0.1.1+2-6, mixed mode, sharing)
解决方案
从系统配置可以看到,你的Mac是aarch64架构(Apple Silicon),而CPLEX 12.9仅支持x86_64架构的Mac,没有提供Apple Silicon兼容的本地库,这是问题的核心。
可通过以下方式解决:
- 升级CPLEX版本:将CPLEX升级到12.10或更高版本,从12.10开始IBM提供了Apple Silicon兼容的本地库。
- 使用Rosetta 2运行x86架构JDK:
- 安装x86架构的OpenJDK或Oracle JDK
- 在IntelliJ中切换项目的JDK为x86版本
- 终端运行时,强制以x86模式执行:
arch -x86_64 java -Djava.library.path=/Library/Java/Extensions -cp ~/Desktop/code/lib/java/cplex-12.9.jar CPLEXTester
- 检查文件权限:确保CPLEX本地库文件具备可读权限,可执行命令:
chmod +r /Library/Java/Extensions/libcplex1290.*
内容的提问来源于stack exchange,提问作者bturner1273
相关产品推荐
相关产品推荐

