2012-08-10 94 views
2

当我用嵌入式firebird导出我的java项目时,我在控制台中看到消息: “no jaybird [22 [Any version,I guess]] in java.library 。路径”。java.library.path中没有jaybird [dll]

但它实际上是我的项目自引用到我的工作区的库路径。我试过很多解决办法像

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?

回答

2

SOLUTION

好吧,这里的解决这个问题。问题是,在jar里面没有dll,也没有任何文件夹被打包在jar里。所以几乎每个dll,包含图片的文件夹或其他文件夹都必须位于可运行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的主方法:

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"))); 

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

请注意,这些LOC必须在ANY CODE之前,并且还包括调用构造函数。注意你是否使用全局静态模块或JNI调用。

我希望这节省了一些时间,我已经失去了12个小时的工作,试图找出正确的。

我真的很感激,如果管理员不抹去我的编辑或这个问题自我回答。

快乐编码= D

相关问题