Java 加载本机的多个war文件

Java 加载本机的多个war文件,java,maven,tomcat,Java,Maven,Tomcat,我们已经从这个版本开始使用新的内部构建的授权库。它在内部加载一个本机文件.so,然后执行它必须执行的任何操作(以前它是基于regex执行的) 现在在我们的应用程序中,我们有两个不同的war文件,它们部署在生产中的同一个tomcat上。它们都使用这个授权库,因此这两个类加载器都尝试加载本机文件两次。这当然是jvm不允许的,因为您只能加载它一次 java.lang.UnsatisfiedLinkError: Native Library /usr/lib64/xxxx-0.1.0.so alread

我们已经从这个版本开始使用新的内部构建的授权库。它在内部加载一个本机文件
.so
,然后执行它必须执行的任何操作(以前它是基于regex执行的)

现在在我们的应用程序中,我们有两个不同的war文件,它们部署在生产中的同一个tomcat上。它们都使用这个授权库,因此这两个类加载器都尝试加载本机文件两次。这当然是jvm不允许的,因为您只能加载它一次

java.lang.UnsatisfiedLinkError: Native Library /usr/lib64/xxxx-0.1.0.so already loaded in another classloader
   at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1903)
   at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1855)
   at java.lang.Runtime.loadLibrary0(Runtime.java:870)
   at java.lang.System.loadLibrary(System.java:1122)
   ....
这个问题的一个解决方案是,我们将这个授权jar放在tomcat/lib中。因此,因为tomcat公共类加载器加载了它,所以子类加载器(war文件)可以自动使用它们,并且每个人都可以访问它。但此解决方案需要特殊维护。我不喜欢这种调整。如果可能的话,我还可以在maven pom中进行一些配置

对于这类问题还有其他更简单的解决办法吗?它是一个纯spring应用程序,基于maven。

它看起来像snappy java,主要成分:“有一个静态块,用于确定要加载的适当本机库,将其复制到文件系统中的唯一位置,然后使用该绝对路径调用system.loadLibrary”。实现是(使用
System.load(nativeLibFile.getAbsolutePath());
)。我很想看看这在你的情况下是否有效。