为什么更改jar名称会导致UnsatisfiedLinkError异常

时间:2018-07-10 14:02:15

标签: java dll jar java-native-interface

为什么名称为 shaded.jar 的相同jar内容无法加载dll而名称为 sigar.jar 的jar无法成功加载?

我在Maven中使用阴影罐子,它创建了一个罐子: shaded.jar

我有一件神器:

<dependency>

        <groupId>org.hyperic</groupId>

        <artifactId>sigar</artifactId>

        <version>1.6.5.132-7</version>

    </dependency

我在代码中使用它,例如:

SigarProxyCache.newInstance(new Sigar(), 100).getPid();

由于此jar使用dll,因此我将所有dll与 shaded.jar 保留在同一文件夹中,但仍然出现以下异常:

  

原因:org.hyperic.sigar.SigarException:   java.lang.UnsatisfiedLinkError:org.hyperic.sigar.Sigar.getPid()J在   org.hyperic.sigar.SigarProxyCache.invoke(SigarProxyCache.java:220)     ...还有2个

如果我将sigar.jar (已添加到shaded.jar的相同版本)直接添加到类路径中,而不是将其包装在 shaded .jar 中,也不例外抛出并成功加载dll。 (由于jar和lib位于同一文件夹中,因此无需修改java.library.path

此外,即使我从类路径中删除sigar.jar并将我的shaded.jar(包含打包好的sigar)重命名为sigar.jar,dll加载仍然成功。

现在我转介了以下帖子:

Extract and load DLL from JAR

UnsatisfiedLinkError: no opencv_java249 in java.library.path

这是一个解决方案,但我的问题是,为什么更改名称会影响dll加载。由于在 shaded.jar sigar.jar 内部,软件包的结构完全相同,并且在两种情况下dll都与jar平行。

以下是sigar.jar需要的dll / so文件列表,它们都包含 sigar enter image description here

1 个答案:

答案 0 :(得分:2)

很好奇。看看github上的代码。要查找它们采用类名称的本机库的名称,请在类路径中搜索具有相同名称的jar文件,然后在找到该目录的目录中查找。当您将类放入另一个名称的文件中时,找不到jar,因此同目录方法会失败。