我们试图在CentOS中通过带有Tomcat服务器的Java应用程序运行Gurobi。定义了系统变量:
declare -x GRB_LICENSE_FILE="/home/suporte/gurobi.lic"
declare -x GUROBI_HOME="/opt/gurobi752/linux64"
declare -x LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:\${GUROBI_HOME}/lib"
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:\$JAVA_HOME/bin:\$GUROBI_HOME/bin"Gurobi和Java工作得很好。应用程序在Tomcat中也运行良好,但是当它调用Gurobi时,我们得到一个例外:"java.lang.UnsatisfiedLinkError: no GurobiJni75 in java.library.path“。
Exception in thread "Thread-14" java.lang.UnsatisfiedLinkError: no GurobiJni75 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at gurobi.GurobiJni.<clinit>(GurobiJni.java:243)
at gurobi.GRBEnv.<init>(GRBEnv.java:41)
at gurobi.GRBEnv.<init>(GRBEnv.java:31)
at br.com.lapin.otimizacao.model.ModelCorteGurobi.<init>(ModelCorteGurobi.java:43)有什么办法解决这个问题吗?
这是脚本输出..。
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre/lib/resources.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.:java.vendor : Oracle sun.java.launcher : SUN_STANDARD catalina.base : /opt/tomcat sun.management.compiler : HotSpot 64位分层编译器catalina.useNaming : trueos.name : Linux sun.boot.class.path :sun.management.compiler0.161-0.b14.el7_4.x86_64/jre/lib/rt.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre/lib/jsse.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre/lib/jce.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre/lib/charsets.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre/lib/jfr.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre/classes java.util.logging.config.file : /opt/ tomcat /conf/logging.properties : Oracle java.runtime.version : 1.8.0_161-b14 user.name :tomcat tomcat.util.scan.StandardJarScanFilter.jarsToScan :log4j-web*..jar,Log4j-taglib*..jar,log4javascript*.jarSlf4j-taglib*..jar shared.loader : tomcat.util.buf.StringCache.byte.enabled : true user.language : en java.naming.factory.initial : org.apache.naming.java.javaURLContextFactory sun.boot.library.path :org.apache.naming.java.javaURLContextFactory jdk.tls.ephemeralDHKeySize : 2048 java.version : 1.8.0_161 java.util.logging。经理: java.util.concurrent.ForkJoinPool.common.threadFactory : org.apache.catalina.startup.SafeForkJoinWorkerThreadFactory java.endorsed.dirs : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre/lib/endorsed sun.cpu.isalist : sun.jnu.encoding : UTF-8 file.encoding.pkg :sun.io package.access : sun.org.apache.catalina.,org.apache.coyote.,org.apache.jasper.,org.apache.tomcat./usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jrejava.vm.info : file.separator : /java.specification.name : java.home规范java.class.version : 52.0 user.country : US java.home: os.version :混合模式os.version: 3.10.0-693.17.1.el7.x86_64 path.separator : java.vm.version : 25.161-b14 Java。protocol.handler.pkgs : org.apache.catalina.webresources java.awt.printerjob : sun.print.PSPrinterJob sun.io.unicode.encoding : UnicodeLittle awt.toolkit : sun.awt.X11.XToolkit package.definition : sun.org.apache.catalina.,org.apache.coyote.,org.apache.jasper.,org.apache.naming.,org.apache.tomcat.java.naming.factory.url.pkgs : org.apache.naming java.security.egd : file:/dev/./urandom user.home : /opt/tomcat java.specification.vendor :甲骨文公司user.home: bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,注释-api.jar,el-api.jar,jsp-api.jar,servlet-api.jar,websocket-api.jar,jaspic-api.jar,catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-storeconfig.jar,catalina-tribes.jar,jasper.jar,jasper-el.jar,ecj-..jar,tomcat-api.jar,tomcat-util.jar,tomcat-util-can.jar,tomcat-coyote.jar,tomcat-dbcp.jar,tomcat-jni.jar,tomcat-websocket.jar,tomcat-i18n-en.jar,tomcat-i18n-es.jar,tomcat-i18n-fr.jar,tomcat-i18n-ja.jar,tomcat-jmx-rete.jar,catalina-ws.jar,tomcat-.jar,tools.jar c.h2*.jar,hibernate*.jar,httpclient*.jar,jmx-tools.jar,jta*.jar,log4j*.jar,mail*.jar,slf4j*.jar,xercesImpl.jar,xmlParserAPIs.jar,xml-apis.jar,junit.jar,junit-..jar,hamcrest-..jar,easymok-.jar,cglib-..jar,objenesis,ant-launcher.jar,cobertura-..jar,asm-..jar,dom4j-..jar,icu4j-..jar,jaxen-..jar,jdom-..jar,jetty-..jar,oro-..jar,oro-..jar/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib java.vendor.url :http://java.oracle.com/ ld.library.path :/opt/gurobi752/linux64 64/lib/ java.vm.vendor : Oracle common.loader:"${catalina.base}/lib“、”${catalina.base}/lib/..jar“、"${catalina.home}/lib",“${catalina.home}/lib/*..jar”“/usr/local/gurobi605/linux64 64”java.runtime.name : OpenJDK Runtime Environment sun.java.command : org.apache.catalina.startup.Bootstrap start java.class.path :java.class.path: Java虚拟机规范java.vm.specification.version : 1.8 catalina.home : /opt/tomcat sun.cpu.endian :小sun.os.patch.level :未知java.awt.headless : true/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre/lib/ext:/usr/java/packages/lib/ext java.io.tmpdir : /opt/tomcat/temp java.vendor.url.bug:http://bugreport.sun.com/bugreport/ server.loader:“/opt/gurobi752/linux64 64/lib/gurobi.jar”os.arch : amd64 java.awt.graphicsenv : sun.awt.X11GraphicsEnvironment java.ext.dirs :sun.awt.X11GraphicsEnvironment user.dir :/ line.separator :java.vm.name : OpenJDK 64位服务器VM ignore.endorsed.dirs : file.encoding : UTF-8 java.specification.version : 1.8
发布于 2018-03-22 19:33:36
有什么办法解决这个问题吗?
您可以将LD_LIBRARY_PATH设置为指向存储.so文件的Gurobi目录,以及存储.jar文件的目录。
您还可以通过复制或链接从Tomcat访问Gurobi文件。
ln -sv $GUROBI_HOME/lib/gurobi.jar $TOMCAT_HOME/lib/编辑1
试一试
declare -x LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${GUROBI_HOME}/lib"而不是
declare -x LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:\${GUROBI_HOME}/lib"使用\存在一个错误,您没有复制/粘贴官方文档。
为了进一步调试,创建一个具有此内容的JSP,它将显示所有系统属性,我们将看到java.library.path。很奇怪以前没人发过这个。
<%@ page import="java.util.Properties" %>
<%@ page import="java.util.Set" %>
<%
Properties p = System.getProperties();
Set<String> keys = p.stringPropertyNames();
for (String key : keys)
out.println(key + " : " + p.getProperty(key));
%>编辑2
从您的调试JSP中,我们可以看到ld.library.path正确地指向您的GUROBI目录。我们可以尝试为java.library.path添加一个系统属性。在Tomcat安装中,编辑或创建包含以下内容的bin/setenv.sh文件:
CATALINA_OPTS="-Djava.library.path=/opt/gurobi752/linux64/lib/"对这个建议的解释可以读到here。
顺便说一下,我不知道你把你的declare -x放在哪里,但是把它们存储在bin/setenv.sh中是合法的。
https://stackoverflow.com/questions/49435172
复制相似问题