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

时间:2017-05-02 16:10:30

标签: java eclipse jar executable-jar

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

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

(使用eclipse)

1 个答案:

答案 0 :(得分:1)

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

此外,对于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无法将应用程序中的本机Java函数映射到实际的本地Java函数。

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

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