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的主要内容,如果未能解决你的问题,请参考以下文章

Nginx和Tomcat配合实现Java Web服务热部署

tomcat下部署多应用加载公共JNI动态库的解决方案

深入理解JNI

Jni规范

tomcat中虚拟主机 web应用 虚拟路径映射相关问题

org.apache.tomcat.jni.LibraryNotFoundError: ... tcnative-1.dll