简体   繁体   English

java 无法在 java.library.path 上找到本机库

[英]java unable to find native libraries on java.library.path

So I am trying to run a very simple java program that uses IBM CPLEX on a mac.所以我试图在 Mac 上运行一个使用 IBM CPLEX 的非常简单的 java 程序。 The program recognizes the JAR file but cannot seem to find the native implementations no matter where I point to it.该程序可以识别 JAR 文件,但无论我指向哪里似乎都找不到本机实现。

The Java Program: Java程序:

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();
        }
    }
}

Output in intellij: 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)

The CPLEX native library location I am trying to use is /Library/Java/Extensions.我尝试使用的 CPLEX 本机库位置是 /Library/Java/Extensions。 As can be seen below I have both libcplex1290.jnilib as well as libcplex1290.dylib in the directory:如下所示,我在目录中有 libcplex1290.jnilib 和 libcplex1290.dylib: /Library/Java/Extensions 列出

Java just keeps throwing UnsatisfiedLinkError(s). Java 只是不断抛出 UnsatisfiedLinkError(s)。 When I explicitly try to link and run the below command in zsh I get the same output:当我明确尝试在 zsh 中链接并运行以下命令时,我得到相同的输出:

java -Djava.library.path=/Library/Java/Extensions -cp ~/Desktop/code/lib/java/cplex-12.9.jar CPLEXTester.java

Another interesting note is that when I try to load the library ie:另一个有趣的注意事项是,当我尝试加载库时,即:

public class CPLEXTester {
    public static void main(String[] args) {
        System.load("/Library/Java/Extensions/libcplex1290.jnilib");
    }
}

I get another UnsatisfiedLinkError:我得到另一个 UnsatisfiedLinkError:

/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)

Does anyone have any ideas on how this can be resolved?有没有人对如何解决这个问题有任何想法? Thank you in advance!先感谢您!

This is my 'About This Mac':这是我的“关于这台 Mac”:

关于我的mac

Java base settings: 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)

Looks like you are running on Apple M1 silicon.看起来您正在 Apple M1 芯片上运行。 I don't think CPLEX has a port for that proessor yet.我认为 CPLEX 还没有用于该处理器的端口。 Given that CPLEX 12.9 was released in 2019, and pre-dates the announcement of the Apple M1 chips by a year, I'm pretty sure that CPLEX 12.9 won't run natively on an M1.鉴于 CPLEX 12.9 于 2019 年发布,并且比 Apple M1 芯片的发布时间早了一年,我很确定 CPLEX 12.9 不会在 M1 上原生运行。

A quote from the IBM community site says: IBM 社区网站的引述说:

We support only intel chip on Mac, not the M1 arm64 chip.我们只支持 Mac 上的英特尔芯片,不支持 M1 arm64 芯片。 So to make CPLEX work on your machine, you have to ask it to use the emulated intel mode via "arch -x86_64 make", "arch -x86_64 gcc" ...因此,要让 CPLEX 在您的机器上工作,您必须通过“arch -x86_64 make”、“arch -x86_64 gcc”...要求它使用模拟 intel 模式。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM