我正在创建一个动态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变量可以正常工作。
任何建议都将受到高度赞赏。
答案 0 :(得分:0)
您的错误是ClassNotFoundException
,这表明未正确包含JAR。如果本机库出现问题,您将获得UnsatisfiedLinkError
。要使JAR可用于Tomcat,您需要将其添加到类路径(-classpath=/path/to/your.jar
)或将其包含在WAR中。后者取决于你的构建系统,但如果你使用Maven,使用maven-shade-plugin
相当容易(这只适用于JAR,你必须继续单独分发本机代码)。希望有所帮助!