【问题标题】:Eclipse exported Runnable Jar fails to locate external librariesEclipse 导出的 Runnable Jar 无法找到外部库
【发布时间】:2017-09-30 06:07:53
【问题描述】:

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

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

(使用日食)

【问题讨论】:

    标签: java eclipse jar executable-jar


    【解决方案1】:

    为了使 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。如果它说的是:

    线程“主”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 函数映射到其实际的本机对应项。

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

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

    【讨论】:

    • 啊,是的。我忘了提。我使用的库是 OpenCV + ntcore。 ntcore.dylibopencv_java320.dylib 都位于生成的 jar 中。但由于某种原因,jar 似乎无法找到我的 OpenCV 库。
    • 我也有类似的问题,OpenCV 也是如此。当我创建从 Eclipse 导出的 JAR 文件时,我无法在我的环境之外运行 JAR。我想创建一个 JAR,以便我可以将它分发给任何人,包括没有安装 OpenCV 的人。那么,如何创建一个包含所有依赖项的 JAR?
    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2014-10-27
    • 2011-06-25
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多