在动态Web项目(Apache Tomcat Server)上使用JNI so文件

时间:2016-05-04 06:21:06

标签: java web-services java-native-interface shared-libraries tomcat8

我正在创建一个动态Web项目,它需要使用外部jar文件。那个jar使用了几个JNI文件。现在我有了jar和所有必需的文件。我已经将jar添加到java构建路径,但我不知道如何将so文件引入tomcat服务器。

我尝试将路径添加到so文件中" LD_LIBRARY_PATH":

  

(属性 - >运行/调试设置 - >编辑 - >环境 - >选择)以及   将路径添加到" java.library.path"(运行   As-> RunConfigurations-> Tomcat v8 Server-> Arguments-> VM参数)   标志。

当我的代码试图从上面提到的jar中访问函数/类时,它仍然无法正常工作,我得到以下错误:

  

SEVERE:用于servlet [org.iotivity.simulator.agent.LaunchSimulator]的Servlet.service()与路径的上下文   [/ SimulatorAgent]抛出异常[Servlet执行扔了一个   异常]与根本原因java.lang.ClassNotFoundException:   org.oic.simulator.server.SimulatorResource $输入   org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305)     在   org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1139)     在   org.iotivity.simulator.agent.LaunchSimulator.doPost(LaunchSimulator.java:86)     在   org.iotivity.simulator.agent.LaunchSimulator.doGet(LaunchSimulator.java:45)     在javax.servlet.http.HttpServlet.service(HttpServlet.java:622)at   javax.servlet.http.HttpServlet.service(HttpServlet.java:729)at at   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)     在   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)     在   org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)     在   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)     在   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)     在   org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)     在   org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)     在   org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)     在   org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)     在   org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)     在   org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)     在   org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)     在   org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)     在   org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)     在   org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:672)     在   org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1502)     在   org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java:1458)     在   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)     在   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:617)     在   org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)     在java.lang.Thread.run(Thread.java:745)

我使用简单的Java应用程序尝试了相同的代码,并且通过设置LD_LIBRARY_PATH变量可以正常工作。

任何建议都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

您的错误是ClassNotFoundException,这表明未正确包含JAR。如果本机库出现问题,您将获得UnsatisfiedLinkError。要使JAR可用于Tomcat,您需要将其添加到类路径(-classpath=/path/to/your.jar)或将其包含在WAR中。后者取决于你的构建系统,但如果你使用Maven,使用maven-shade-plugin相当容易(这只适用于JAR,你必须继续单独分发本机代码)。希望有所帮助!