gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:03:03 26 4
gpt4 key购买 nike

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

我在maven中使用shaded jar。它创建了一个jar:shaded.jar

我有一个 Artifact :

<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 相同的文件夹中,但仍然出现以下异常:

Caused by: org.hyperic.sigar.SigarException: java.lang.UnsatisfiedLinkError: org.hyperic.sigar.Sigar.getPid()J at org.hyperic.sigar.SigarProxyCache.invoke(SigarProxyCache.java:220) ... 2 more

如果我将sigar.jar(已添加到shaded.jar的相同版本)直接添加到类路径,而不是将其打包在shaded.jar中,也不异常(exception)抛出异常并且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.jarsigar.jar 内部,包结构完全相同,并且在这两种情况下,dll 都与 jar 平行。

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

最佳答案

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

关于java - 为什么更改 jar 名称会导致 UnsatisfiedLinkError 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51267285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com