Java Tomcat Web 应用程序 JNI
Posted
技术标签:
【中文标题】Java Tomcat Web 应用程序 JNI【英文标题】:Java Tomcat web application JNI 【发布时间】:2015-02-11 11:00:14 【问题描述】:我有部署到 Tomcat 的 java web 应用程序。应用程序通过 JNI 调用低级 C
库。当我第一次部署我的应用程序时一切正常,但一旦我尝试重新部署 - 应用程序崩溃并出现以下错误:java.lang.UnsatisfiedLinkError: Native Library /opt/apache-tomcat/apache-tomcat-7.0.57/shared/lib/libGenderizer.so already loaded in another classloader
我已创建 .so 对象并将其放在 /opt/apache-tomcat/apache-tomcat-7.0.57/shared/lib 下。
在 catalina.sh(启动 tomcat 的文件)中,我添加了以下行,用于设置 tomcat 的库路径。 JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/opt/apache-tomcat/current/shared/lib"
我正在使用 maven mvn tomcat7:redeploy
重新部署我的应用程序
您能帮我解决当前的问题吗?我正在做 System.gc() 但不幸的是它没有帮助。
public class GenderService
private static Logger logger = Logger.getLogger(GenderService.class);
static
try
System.gc();
System.loadLibrary("Genderizer");
catch(UnsatisfiedLinkError e)
logger.error("Native code library failed to load.\n", e);
private native String genderize(String name);
public Gender identifyGender(Customer customer)
Gender gender = determineGender(customer);
return gender;
【问题讨论】:
.dll already loaded in another classloader?的可能重复 【参考方案1】:已经在SO 上提问。请参阅Apache Tomcat Wiki 以获得有用的答案。
【讨论】:
我读过它,但不幸的是没有明白它是如何工作的。如果我将我的库包装到 JAR 中,我该如何调用它? 如果您将 JAR 添加到 shared/lib 中,则 JAR 中的所有类都可用于您的应用程序,就好像它们位于 WEB-INF/classes 或 WEB-INF/lib 中一样。因此,您只需像以前一样使用 ist。 在我直接在java中使用它们之前,因为我可以import
它在类的顶部。由于文件不在我的项目中,我该如何调用它的方法?假设我有AClass
,它作为方法AMethod(String)
,你能给我举个例子,如果jar 在/shared/lib 中,我该如何调用它?谢谢!
我不明白:为什么它不在你的项目中?您的 GenderService 仍然应该是您项目的一部分。您只需将其部署在单独的 JAR 中。
嗯.. 现在我正在通过 maven 开发和解决所有依赖项。您是说我必须生成 Wrapper jar 并将其添加为 /shared/lib 的外部 jar?同样在 catalina.properties 我必须为 jars 指定文件夹? shared.loader=$catalina.base/shared/lib/*.jar
以上是关于Java Tomcat Web 应用程序 JNI的主要内容,如果未能解决你的问题,请参考以下文章
org.apache.tomcat.jni.LibraryNotFoundError: ... tcnative-1.dll