加载使用 jffi 的 RAR 导致 JBoss/JVM 出现段错误

Loading RAR which uses jffi causes JBoss/JVM to segfault

我有一个内部包含 jffi-1.2.9-native.jar 库的 rar - 加载这个 rar 会导致 jvm 出现段错误 - 并出现以下错误:

 Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library
 <path
 to>/wildfly/standalone/tmp/vfs/deployment/deploymentb41f06df572811e7/jffi-1.2.9-native.jar-d3417b30dd3cfd1/contents/jni/x86_64-Windows/jffi-1.2.dll
 which might have disabled stack guard. The VM will try to fix the
 stack guard now. It's highly recommended that you fix the library with
 'execstack -c <libfile>', or link it with '-z noexecstack'.
 # A fatal error has been detected by the Java Runtime Environment:
 #
 #  SIGSEGV (0xb) at pc=0x00007f9f0990e938, pid=28629, tid=140320456898304
 #
 # JRE version: Java(TM) SE Runtime Environment (8.0_40-b25) (build 1.8.0_40-25)
 # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.40-b25 mixed mode linux-amd64 compressed oops)
 # Problematic frame:
 # C  [ld-linux-x86-64.so.2+0x6938]  _dl_map_object_from_fd+0x898

我不明白的是,当我 运行 所在的平台是:

时为什么要尝试加载此 dll
Linux <machine> 3.0.101-0.15-default #1 SMP Wed Jan 22 15:49:03 UTC 2014 (5c01f4e) x86_64 x86_64 x86_64 GNU/Linux

我的问题是 - 以前有没有人遇到过这种问题 - 是什么导致 windows dll 被加载到这里?

我能想到的唯一可能性,为什么尝试加载 *.dll 而不是 *.so,是系统 属性 os.name 通过了到 JVM 并指定了错误的操作系统。

class OsName {
    public static void main(String[] args) {
        System.out.println("OS: " + System.getProperty("os.name"));
    }
}

如果您 运行 示例为 java -Dos.name=FooBar,则输出为 OS: FooBar

我会 post 一个答案,以防有人遇到类似的问题。我没有找到问题的真正根源。我的解决方法是重新组织 EAR,所以现在所有外部依赖项都被收集到 EAR 中,所有其他子模块(例如 EJB 和 WAR)在 maven 依赖项中指定一个 <scope>provided</scope> .因此 WAR 和 EJB 不包含外部依赖项。这意味着必须在多个地方指定 Maven 依赖项。