【问题标题】:Using JNI so files on a dynamic web project(Apache Tomcat Server)在动态 Web 项目(Apache Tomcat 服务器)上使用 JNI so 文件
【发布时间】:2016-08-29 10:23:14
【问题描述】:

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

我尝试将 so 文件的路径添加为“LD_LIBRARY_PATH”:

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

仍然无法正常工作,每当我的代码尝试从上述 jar 访问函数/类时,我都会遇到以下错误:

严重:Servlet.service() 用于 servlet [org.iotivity.simulator.agent.LaunchSimulator] 在上下文中的路径 [/SimulatorAgent] 抛出异常 [Servlet 执行抛出了一个异常 异常],根本原因是 java.lang.ClassNotFoundException: org.oic.simulator.server.SimulatorResource$Type at 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) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 在 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 变量可以正常工作。

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

【问题讨论】:

  • 嗨 Mushfiqul,欢迎来到 SO。你能看看如何更好地格式化你的问题吗?这对社区来说会很棒。
  • 看起来 JAR 文件尚未部署到 Web 应用程序。检查已部署应用程序的 WEB-INF/lib 的内容以查看 JAR 是否存在。
  • @MarkThomas:感谢您的建议。实际上,我的 Web 服务应该只是一个服务,没有任何用户界面。所以没有WEB-INF文件夹。我创建了文件夹并将jar和so文件放在WEB-INF/lib中。现在我的previuos问题解决了。但是仍然找不到so文件:“无法打开共享对象文件:没有这样的文件或目录”
  • 其实可以找到最初的so文件,但是在第一个so中使用了另一个so文件(两者都在同一个目录下),这次得到java.link.UnsatisfiedLinkError

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2015-11-23
    • 1970-01-01
    • 2014-01-08
    相关资源
    最近更新 更多