Java 中 Gurobi 优化器的 UnsatisfiedLinkError
UnsatisfiedLinkError with Gurobi Optimizer in Java
我正在尝试在 Java 项目中使用 Gurobi 8.1。我在 .zshrc
:
中设置了以下环境变量
export GUROBI_HOME="/home/user/tool/gurobi811/linux64"
export PATH="${PATH}:${GUROBI_HOME}/bin"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${GUROBI_HOME}/lib"
export GRB_LICENSE_FILE="/home/user/tool/gurobi811/gurobi.lic"
这是根据以下链接完成的:Software Installation Guide and Setting environment variables。这使我能够成功 运行 优化器的交互 shell。
但是,当我尝试在 Netbeans 项目中使用优化器时出现以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no GurobiJni81 in java.library.path: [/usr/java/packages/lib, /usr/lib64, /lib64, /lib, /usr/lib]
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2660)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
at java.base/java.lang.System.loadLibrary(System.java:1867)
at gurobi.GurobiJni.<clinit>(GurobiJni.java:261)
at gurobi.GRBEnv.<init>(GRBEnv.java:56)
at br.gurobi.test.main.Main.main(Main.java:31)
/home/user/project/nbproject/build-impl.xml:1328: The following error occurred while executing this line:
/home/user/project/nbproject/build-impl.xml:948: Java returned: 1
BUILD FAILED (total time: 0 seconds)
如果我使用 -Djava.library.path=/path/to/lib
选项 (as used here),我会得到另一个错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/user/tool/gurobi811/linux64/lib/libGurobiJni81.so: libgurobi81.so: cannot open shared object file: No such file or directory
at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430)
at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487)
at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684)
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2649)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
at java.base/java.lang.System.loadLibrary(System.java:1867)
at gurobi.GurobiJni.<clinit>(GurobiJni.java:261)
at gurobi.GRBEnv.<init>(GRBEnv.java:56)
at br.gurobi.test.main.Main.main(Main.java:31)
/home/user/project/nbproject/build-impl.xml:1328: The following error occurred while executing this line:
/home/user/project/nbproject/build-impl.xml:948: Java returned: 1
BUILD FAILED (total time: 0 seconds)
我已将 gurobi.jar
和 gurobi-javadoc.jar
添加到我的项目编译时库中。我没有在 Apache Netbeans 11 中找到定义环境变量的地方。
我可以通过从终端(我所有的用户变量都已设置)执行 Netbeans 来设法 运行 优化器。
不过,我会等待显示如何直接在 Netbeans 上设置环境变量的答案。
我从未找到 "nice" 在 project/target 级别上使用较新的 Netbeans 版本设置环境变量的方法。一个可行的技巧是将 LD_LIBRARY_PATH
设置 全局添加到 netbeans,即编辑 <your netbeans install directory>/etc/netbeans.conf
以包含行
export LD_LIBRARY_PATH=<absolute path to the gurobi lib dir>
也可以在 OS 级别全局设置这样的环境变量,但这更难看。
一个可能更好的解决方案是在 Netbeans 项目中设置适当的环境变量的自定义 Ant 脚本,但是由于上面的 hack 对我的目的来说已经足够好了,所以我没有进一步追求它。
我在使用 IntelliJ 时遇到了同样的问题,这是我的解决方案:只需从终端 运行 您的 IDE 并尝试 运行ning 您的程序。据我所知,将加载 .zshrc 中定义的全局环境变量(我使用的是 .bashrc 文件,因为我使用的是 Ubuntu),程序将运行!
我正在尝试在 Java 项目中使用 Gurobi 8.1。我在 .zshrc
:
export GUROBI_HOME="/home/user/tool/gurobi811/linux64"
export PATH="${PATH}:${GUROBI_HOME}/bin"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${GUROBI_HOME}/lib"
export GRB_LICENSE_FILE="/home/user/tool/gurobi811/gurobi.lic"
这是根据以下链接完成的:Software Installation Guide and Setting environment variables。这使我能够成功 运行 优化器的交互 shell。
但是,当我尝试在 Netbeans 项目中使用优化器时出现以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no GurobiJni81 in java.library.path: [/usr/java/packages/lib, /usr/lib64, /lib64, /lib, /usr/lib]
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2660)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
at java.base/java.lang.System.loadLibrary(System.java:1867)
at gurobi.GurobiJni.<clinit>(GurobiJni.java:261)
at gurobi.GRBEnv.<init>(GRBEnv.java:56)
at br.gurobi.test.main.Main.main(Main.java:31)
/home/user/project/nbproject/build-impl.xml:1328: The following error occurred while executing this line:
/home/user/project/nbproject/build-impl.xml:948: Java returned: 1
BUILD FAILED (total time: 0 seconds)
如果我使用 -Djava.library.path=/path/to/lib
选项 (as used here),我会得到另一个错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/user/tool/gurobi811/linux64/lib/libGurobiJni81.so: libgurobi81.so: cannot open shared object file: No such file or directory
at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430)
at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487)
at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684)
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2649)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
at java.base/java.lang.System.loadLibrary(System.java:1867)
at gurobi.GurobiJni.<clinit>(GurobiJni.java:261)
at gurobi.GRBEnv.<init>(GRBEnv.java:56)
at br.gurobi.test.main.Main.main(Main.java:31)
/home/user/project/nbproject/build-impl.xml:1328: The following error occurred while executing this line:
/home/user/project/nbproject/build-impl.xml:948: Java returned: 1
BUILD FAILED (total time: 0 seconds)
我已将 gurobi.jar
和 gurobi-javadoc.jar
添加到我的项目编译时库中。我没有在 Apache Netbeans 11 中找到定义环境变量的地方。
我可以通过从终端(我所有的用户变量都已设置)执行 Netbeans 来设法 运行 优化器。
不过,我会等待显示如何直接在 Netbeans 上设置环境变量的答案。
我从未找到 "nice" 在 project/target 级别上使用较新的 Netbeans 版本设置环境变量的方法。一个可行的技巧是将 LD_LIBRARY_PATH
设置 全局添加到 netbeans,即编辑 <your netbeans install directory>/etc/netbeans.conf
以包含行
export LD_LIBRARY_PATH=<absolute path to the gurobi lib dir>
也可以在 OS 级别全局设置这样的环境变量,但这更难看。
一个可能更好的解决方案是在 Netbeans 项目中设置适当的环境变量的自定义 Ant 脚本,但是由于上面的 hack 对我的目的来说已经足够好了,所以我没有进一步追求它。
我在使用 IntelliJ 时遇到了同样的问题,这是我的解决方案:只需从终端 运行 您的 IDE 并尝试 运行ning 您的程序。据我所知,将加载 .zshrc 中定义的全局环境变量(我使用的是 .bashrc 文件,因为我使用的是 Ubuntu),程序将运行!