使用嵌入式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?
答案 0 :(得分:2)
<强>解强>
好的,这是解决这个问题的方法。问题是罐子里面没有dll,也没有带文件的文件夹被打包在jar中。所以几乎每个dll,带有图像的文件夹或其他任何内容都必须位于runnable jar所在的文件夹旁边。 jar中唯一包装的是外部jar和运行软件的.java文件。
无论如何,使用Firebird嵌入模式它非常棘手。由于jaybird(SOME_VERSION).dll必须放在所有.dll,.msg文件旁边。但是JVM会要求jaybird dll位于java.library.path中,当然它只是system32和一些与程序无关的java文件夹。
所以,为了让你的程序检测你的runnable 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个小时的工作,试图弄清楚这一点。
我真的很感激管理员不会删除我的编辑或这个问题自己回答。
快乐编码= D