java - Eclipse 导出的 Runnable Jar 无法找到外部库

标签 java eclipse jar executable-jar

我有一个带有两个外部库的 Java 项目。 Eclipse 中一切运行良好,导出为可运行 JAR 时没有错误。但是,当我使用 java -jar myapplication.jar, 通过命令行运行我的项目时它抛出了臭名昭著的java.lang.UnsatisfiedLinkError: no in java.library.path .

我尝试使用所有三个导出选项(提取、打包、复制),但没有成功。

(使用eclipse)

最佳答案

为了让 System.loadLibrary() 工作,库(在 Windows 上,DLL)必须位于 PATH 上某个目录中或 java.library.path 系统属性中列出的路径中(这样您就可以像 java -Djava.library.path=/path/to/dir 一样启动 Java。

此外,对于 loadLibrary(),您可以指定库的基本名称,末尾不带 .dll。因此,对于/path/to/something.dll,您只需使用 System.loadLibrary("something")。

您还需要查看您收到的确切 UnsatisfiedLinkError。如果它说的是这样的:

线程“main”java.lang.UnsatisfiedLinkError中出现异常:java.library.path中没有foo 那么它在您的 PATH 或 java.library.path 中找不到 foo 库 (foo.dll)。如果它说的是这样的:

线程“main”中出现异常 java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo()V 那么库本身就有问题,因为 Java 无法将应用程序中的 native Java 函数映射到其实际的 native 对应项。

首先,我会在您的 System.loadLibrary() 调用周围放置一些日志记录,以查看其是否正确执行。如果它抛出异常或者不在实际执行的代码路径中,那么您将始终得到上面解释的后一种类型的 UnsatisfiedLinkError。

作为旁注,大多数人将 loadLibrary() 调用放入具有 native 方法的类中的静态初始化 block 中,以确保它始终只执行一次:

关于java - Eclipse 导出的 Runnable Jar 无法找到外部库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43742601/

相关文章:

java - 2个位置之间的距离法

java - 使用条件创建别名时列索引超出范围

java - 如何告诉 Maven 包含 jar 依赖项,而不是 Eclipse 中的子项目源目录?

Python 不会在模块中找到变量

java - 如何将Spring Boot应用程序指向外部jar的logback.xml

java - 在unix中使用.sh文件运行.jar文件

java - 从 json 数据/数组创建微调器选项

android - 在 Eclipse 中调试 Android NDK C/C++ 代码 - 断点未命中

java - 安装 JAR 文件

java - 读取连续传入的数据(usb4java)