Java中的Gurobi Optimizer出现UnsatisfiedLinkError

时间:2019-05-13 20:58:59

标签: java netbeans gurobi

我正在尝试在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 Setting environment variables。这使我能够成功运行优化器的交互式外壳。

但是,尝试在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.jargurobi-javadoc.jar添加到了项目编译时库中。我没有在Apache Netbeans 11中找到定义环境变量的位置。

3 个答案:

答案 0 :(得分:1)

我从未发现使用较新的Netbeans版本在项目/目标级别设置环境变量的“好”方法。虽然有效,但一种黑客正在将LD_LIBRARY_PATH设置全局地添加到netbeans ,即,编辑<your netbeans install directory>/etc/netbeans.conf以包括该行

export LD_LIBRARY_PATH=<absolute path to the gurobi lib dir>

也可以在操作系统级别上全局设置此类环境变量,但这更加丑陋。

一个大概更好的解决方案是在Netbeans项目中使用一个自定义的Ant脚本来设置适当的环境变量,但是由于上述破解足以满足我的目的,因此我从此不再赘述。

答案 1 :(得分:0)

我可以通过从终端(已经设置了所有用户变量的终端)执行Netbeans来设法运行优化器。

不过,我将等待一个答案,该答案显示了如何直接在Netbeans上设置环境变量。

答案 2 :(得分:0)

我在IntelliJ上遇到了同样的问题,这是我的解决方案:只需从终端运行IDE,然后尝试运行程序即可。据我所知,将加载 .zshrc (在我的情况下为.bashrc文件,因为我使用Ubuntu的情况下)中定义的全局环境变量,程序将正常工作!