java - java.library.path 中没有 jaybird [dll]

标签 java desktop-application dll firebird2.5

当导出带有嵌入式 firebird 的 java 项目时,我在控制台中收到以下消息: “java.library.path 中没有 jaybird[22[任何版本,我猜]]”。

但它确实位于我的项目自引用到我的工作区的库路径上。我已经尝试了很多解决方法,例如

System.LoadFile("jaybird22.dll") //full uri, just the name of the dll, nada
System.Load("jaybird22.dll") //full uri, just the name of the dll, nada

或将 dll 插入用户库中 或者将 dll 作为引用的库放在另一个文件夹中。

这真的让我很紧张。 如何解决此错误? JNI?

最佳答案

解决方案

好的,这是这个问题的解决方案。问题是,在 jar 内,没有 dll 或任何包含文件的文件夹被打包在 jar 中。因此,几乎每个 dll、包含图像的文件夹或其他内容都必须位于可运行 jar 所在文件夹旁边的文件夹中。 jar 中打包的唯一内容是外部 jar 和运行软件的 .java 文件。

无论如何,对于 Firebird 嵌入模式来说,这是相当棘手的。由于 jaybird(SOME_VERSION).dll 必须放置在所有 .dll、.msg 文件旁边。但是JVM会要求jaybird dll位于java.library.path中,当然这只是system32和一些与程序无关的java文件夹。

因此,为了让您的程序将可运行的 jar 文件夹检测为 java.library.path(实际上应该称为路径),其中 jaybird dll 文件以及其他 firebird 文件和文件夹是您将这些 LOC 放入 main 方法中:

String decodedPath =URLDecoder.decode(ClassLoader.getSystemClassLoader().getResource(".").getPath(), "UTF-8");
decodedPath=decodedPath.substring(1, decodedPath.length()-1).replaceAll("/", "\\\\");
System.setProperty("java.library.path",decodedPath+";"+System.getProperty("java.library.path")));

我将以前的目录作为库路径,因为我只是将其添加到列表中。

请注意,这些 LOC 必须位于任何代码之前,并且还包括调用构造函数。如果您使用全局静态模块或 JNI 调用,请小心。

我希望这可以节省某人的时间,为了正确解决这个问题,我已经浪费了 12 个小时的时间。

如果管理员不删除我的编辑或这个问题的 self 回答,我将非常感激。

快乐编码=D

关于java - java.library.path 中没有 jaybird [dll],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905362/

相关文章:

java - 如何将 byteArray 写入文件?

java - 如何获取两个字符串中不匹配字符的数量?

java - 将 CURL 请求转换为 HTTP 请求 Java

java - 将 JavaFX 2.0 WebView 集成到 Swing Java SE 6 应用程序中

python - Paramiko 连接问题

c# - 在同一存储库中运行没有 nunit.framework.dll 的 NUnit 测试

C++ - 在 Windows 上导入明确专用的模板

java - SortedMap 与 CheckedSortedMap 与 synchronizedSortedMap

desktop-application - Appcelerator Titanium Studio 1.0.1 : How to show Inspector on OS X Desktop apps?

c# - 使用使用不同编译器编译的 DLL