我在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加载仍然成功。
现在我转介了以下帖子:
UnsatisfiedLinkError: no opencv_java249 in java.library.path
这是一个解决方案,但我的问题是,为什么更改名称会影响dll加载。由于在 shaded.jar 和 sigar.jar 内部,软件包的结构完全相同,并且在两种情况下dll都与jar平行。
答案 0 :(得分:2)
很好奇。看看github上的代码。要查找它们采用类名称的本机库的名称,请在类路径中搜索具有相同名称的jar文件,然后在找到该目录的目录中查找。当您将类放入另一个名称的文件中时,找不到jar,因此同目录方法会失败。