2012-08-10 59 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

相關問題