首页 文章

java.lang.UnsatisfiedLinkError:没有GurobiJni / Tomcat

提问于
浏览
1

我们正在尝试通过CentOS中的Tomcat服务器的Java Web应用程序运行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:java.library.path中没有GurobiJni75” .

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)

有什么想法解决这个问题吗?

这是脚本输出...

java.vendor:Oracle Corporation sun.java.launcher:SUN_STANDARD catalina.base:/ opt / tomcat sun.management.compiler:HotSpot 64位分层编译器catalina.useNaming:trueos.name:Linux sun.boot.class.path: /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.0.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的3.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 java.vm.specification .vendor:Oracle Corporation java.runtime.version:1.8.0_161-b14 user.name:tomcat tomcat.util.scan.StandardJarScanFilter.jarsToScan:log4j-web * .jar,log4j-taglib * .jar,log4javascript * .jar,slf4j-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:/usr/lib/jvm/java-1.8.0- openjdk-1.8.0.161-0.b14.el7_4.x86_64 / jre / lib / amd64 jdk.tls.ephemeralDHKeySize:2048 java.version:1.8.0_161 java.util.logging.manager:org.apache.juli.ClassLoaderLogManager user . timezone:Etc / UTC sun.arch.data.model:64 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 . file.separator:/java.specification.name:Java Platform API Specification java.class.version:52.0 user.country:US java.home:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161- 0.b14.el7_4.x86_64 / jrejava.vm.info:混合模式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 . ,java . ,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:Oracle Corporation tomcat.util.scan .StandardJarScanFilter.jarsToSkip:bootstrap.jar,公地daemon.jar,Tomcat的juli.jar,注释-api.jar中,EL-api.jar中,JSP-api.jar文件,servlet的api.jar文件,WebSocket的-api.jar中,jaspic的API . jar ,catalina.jar,卡塔利娜-的ant.jar,卡塔利娜-ha.jar,卡塔利娜-storeconfig.jar,卡塔利娜-tribes.jar,jasper.jar,碧玉-el.jar,ECJ-的.jar,Tomcat的api.jar文件,Tomcat的util.jar,Tomcat的UTIL-scan.jar,Tomcat的coyote.jar,Tomcat的dbcp.jar,Tomcat的jni.jar,Tomcat的websocket.jar,Tomcat的I18N-en.jar,Tomcat的I18N -es.jar,Tomcat的国际化,fr.jar,Tomcat的国际化,ja.jar,Tomcat的巨力,adapters.jar,卡特琳娜 - JMX的remote.jar,卡特琳娜 - ws.jar,Tomcat的了jdbc.jar,工具的.jar,公地beanutils.jar,公地编解码器的* .jar,公共的集合的* .jar,公地DBCP的* .jar,公共沼气池的* .jar,公地文件上传的* .jar,公地的HttpClient的* .jar ,公共-IO的* .jar,公地郎的* .jar,共享记录的* .jar,公地数学的* .jar,公共池的* .jar,的jstl.jar,标签库标准规格-的.jar,Geronimo的-spec-没有jaxrpc.jar,WSDL4J的* .jar,的ant.jar, Ant 的JUnit的* .jar,AspectJ中的* .jar,jmx.jar,H2的* .jar,冬眠的* .jar,HttpClient的的* .jar,JMX的工具的.jar,JTA的* .jar的是,log4j的* .jar,邮件的* .jar, SLF4J的* .jar,xercesImpl.jar,xmlParserAPIs.jar,XML-apis.jar,的junit.jar,的junit.jar,hamcrest-的.jar,EasyMock的-的.jar,CGLIB-的.jar,objenesis-的.jar,ant- launcher.jar,的Cobertura-的.jar,ASM-的.jar,DOM4J-的.jar,ICU4J-的.jar,Jaxen的-的.jar,JDOM-的.jar,码头-的.jar,口 - 的.jar,servlet的API-的.jar ,tagsoup-.jar,xmlParserAPIs-.jar,xom-.jar java.library.path:/ usr / java / packages / lib / amd64:/ usr / lib64:/ lib64:/ lib:/ usr / lib java.vendor .url:http://java.oracle.com/ ld.library.path:/ opt / gurobi752 / linux64 / lib / java.vm.vendor:Oracle Corporation common.loader:"$/lib",“$ /lib/.jar "," $ {catalina . home} / lib "," $ / lib / * .jar "," / usr / local / gurobi605 / linux64“java.runtime.name:OpenJDK Runtime Environment sun.java.command:org.apache.catalina.startup . Bootstrap start java.class.path:/opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jarjava.vm.specification.name:Java虚拟机规范java.vm.specification.version: 1.8 catalina.home:/ opt / tomcat sun.cpu.endian:little sun.os.pa tch.level:unknown java.awt.headless:true java.io.tmpdir:/ opt / tomcat / temp java.vendor.url.bug:http://bugreport.sun.com/bugreport/ server.loader:"/opt/gurobi752/linux64/lib/gurobi.jar" os.arch:amd64 java.awt.graphicsenv:sun .awt.X11GraphicsEnvironment java.ext.dirs:/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 user.dir:/ line.separator:java.vm.name:OpenJDK 64位服务器VM ignore.endorsed.dirs:file.encoding:UTF-8 java.specification.version:1.8

1 回答

  • 1

    有什么想法来解决这个问题吗?

    您可以将LD_LIBRARY_PATH设置为指向存储.so文件的Gurobi目录,以及存储.jar文件的目录 .

    您还可以通过复制或链接从Tomcat访问Gurobi jar文件 .

    ln -sv $GUROBI_HOME/lib/gurobi.jar $TOMCAT_HOME/lib/
    

    Edit 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));
    
    %>
    

    Edit 2

    从您的调试JSP我们看到 ld.library.path 正确指向您的GUROBI lib目录 . 我们可以尝试为 java.library.path 添加系统属性 . 在Tomcat安装中,使用以下内容编辑或创建 bin/setenv.sh 文件:

    CATALINA_OPTS="-Djava.library.path=/opt/gurobi752/linux64/lib/"
    

    对此建议的解释可以阅读here .

    顺便说一句我不知道你把 declare -x 放在哪里,但将它们存放在bin / setenv.sh中是合理的

相关问题