2

当使用嵌入式 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 作为引用库放在另一个文件夹中。

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

4

1 回答 1

2

解决方案

好的,这是解决此问题的方法。问题是在 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 必须在 ANY CODE 之前,并且还包括调用构造函数。如果您正在使用全局静态模块或 JNI 调用,请注意。

我希望这可以节省一些时间,我已经失去了 12 个小时的工作来试图正确地解决这个问题。

如果管理员不删除我的编辑或自行回答此问题,我将不胜感激。

快乐编码 =D

于 2012-08-13T15:06:01.917 回答