2013-03-21 141 views
4

我正經歷着類似的問題,這個問題sqlite4java罐:UnsatisfiedLinkError用在Mac OS X中使用NetBeans

UnsatisfiedLinkError with sqlite4java Jar on Mac OS X

不過,我在Mac上運行,而我有相關的庫在我的lib夾。但是,如果我按原樣運行,則會得到UnsatisfiedLinkError。如果我運行「Java的罐子sqlite4java.jar -d」我得到以下輸出:

sqlite4java 282 
130321:222850.424 FINE [sqlite] Internal: loading library 
130321:222850.425 FINE [sqlite] Internal: java.library.path=/Users/mikey/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. 
130321:222850.425 FINE [sqlite] Internal: sqlite4java.library.path=null 
130321:222850.425 FINE [sqlite] Internal: cwd=/Users/mikey/NetBeansProjects/Test/lib/. 
130321:222850.425 FINE [sqlite] Internal: default path=/Users/mikey/NetBeansProjects/Test/lib 
130321:222850.425 FINE [sqlite] Internal: forced path=null 
130321:222850.426 FINE [sqlite] Internal: os.name=mac os x; os=osx 
130321:222850.426 FINE [sqlite] Internal: os.arch=x86_64 
130321:222850.426 FINE [sqlite] Internal: trying to load sqlite4java-osx-x86_64 
130321:222850.427 FINE [sqlite] Internal: cannot load sqlite4java-osx-x86_64: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64 in java.library.path 
130321:222850.427 FINE [sqlite] Internal: trying to load sqlite4java-osx-amd64 
130321:222850.428 FINE [sqlite] Internal: cannot load sqlite4java-osx-amd64: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-amd64 in java.library.path 
130321:222850.428 FINE [sqlite] Internal: trying to load sqlite4java-osx-10.4 
130321:222850.431 INFO [sqlite] Internal: loaded sqlite4java-osx-10.4 from system path 
130321:222850.433 INFO [sqlite] Internal: loaded sqlite 3.7.10, wrapper 0.2 
SQLite 3.7.10 
Compile-time options: ENABLE_COLUMN_METADATA ENABLE_FTS3 ENABLE_FTS3_PARENTHESIS ENABLE_LOCKING_STYLE=0 ENABLE_MEMORY_MANAGEMENT ENABLE_RTREE OMIT_DEPRECATED TEMP_STORE=1 THREADSAFE=1 

我可以看到它正在尋找sqlite4java-OSX-x86_64的庫,所以我然後跑都「LN - 小號libsqlite4java-osx.jnilib libsqlite4java-OSX-x86_64.jnilib」和 「LN -s libsqlite4java-OSX-10.4.jnilib libsqlite4java-OSX-x86_64.jnilib」 這似乎幫助:

sqlite4java 282 
130321:223211.473 FINE [sqlite] Internal: loading library 
130321:223211.474 FINE [sqlite] Internal: java.library.path=/Users/mikey/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. 
130321:223211.474 FINE [sqlite] Internal: sqlite4java.library.path=null 
130321:223211.474 FINE [sqlite] Internal: cwd=/Users/mikey/NetBeansProjects/Test/lib/. 
130321:223211.474 FINE [sqlite] Internal: default path=/Users/mikey/NetBeansProjects/Test/lib 
130321:223211.474 FINE [sqlite] Internal: forced path=null 
130321:223211.475 FINE [sqlite] Internal: os.name=mac os x; os=osx 
130321:223211.475 FINE [sqlite] Internal: os.arch=x86_64 
130321:223211.475 FINE [sqlite] Internal: trying to load sqlite4java-osx-x86_64 
130321:223211.477 INFO [sqlite] Internal: loaded sqlite4java-osx-x86_64 from system path 
130321:223211.479 INFO [sqlite] Internal: loaded sqlite 3.7.10, wrapper 0.2 
SQLite 3.7.10 
Compile-time options: ENABLE_COLUMN_METADATA ENABLE_FTS3 ENABLE_FTS3_PARENTHESIS ENABLE_MEMORY_MANAGEMENT ENABLE_RTREE OMIT_DEPRECATED TEMP_STORE=1 THREADSAFE=1 

似乎罰款,對?不。當我嘗試運行我的java代碼時,嘗試使用UnsatisfiedLinkError打開數據庫時又失敗了。

有什麼明顯的我失蹤了嗎?下面是相關部分的LS我的lib目錄只是作爲一個全面的檢查:

[email protected] 1 mikey staff 466792 1 Mar 2012 libsqlite4java-android-armv7.so 
[email protected] 1 mikey staff 790986 1 Mar 2012 libsqlite4java-linux-amd64.so 
[email protected] 1 mikey staff 732637 1 Mar 2012 libsqlite4java-linux-i386.so 
[email protected] 1 mikey staff 1400368 1 Mar 2012 libsqlite4java-osx-10.4.jnilib 
[email protected] 1 mikey staff 1401592 1 Mar 2012 libsqlite4java-osx-ppc.jnilib 
lrwxr-xr-x 1 mikey staff  25 21 Mar 22:31 libsqlite4java-osx-x86_64.jnilib -> libsqlite4java-osx.jnilib 
[email protected] 1 mikey staff 1433640 1 Mar 2012 libsqlite4java-osx.jnilib 
-rw-r--r-- 1 mikey staff  928 17 Mar 17:05 nblibraries.properties 
drwxr-xr-x 3 mikey staff  102 15 Mar 18:59 sqlite4java 
drwxr-xr-x 13 mikey staff  442 19 Mar 17:49 sqlite4java-282 2 
[email protected] 1 mikey staff 102236 1 Mar 2012 sqlite4java-docs.zip 
[email protected] 1 mikey staff 100502 1 Mar 2012 sqlite4java-src.zip 
[email protected] 1 mikey staff 622080 1 Mar 2012 sqlite4java-win32-x64.dll 
[email protected] 1 mikey staff 462848 1 Mar 2012 sqlite4java-win32-x86.dll 
[email protected] 1 mikey staff 129381 1 Mar 2012 sqlite4java.jar 

和我的數據庫連接代碼的副本:

import com.almworks.sqlite4java.SQLiteConnection; 
import com.almworks.sqlite4java.SQLiteException; 
import java.io.File; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

/** 
* Wrapper for Sqlite 
* 
* @author mikey 
*/ 
public class Database { 

    private SQLiteConnection db; 

    public Database() { 
     db = new SQLiteConnection(new File("./test.db")); 
     try { 
      db.open(true); 
     } catch (SQLiteException ex) { 
      Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

感謝你對我的問題有何啓示...

編輯

針對這裏@sereda是把「com.almworks.sqlite4java.SQLite.main輸出( new String [] {「-d」});「到數據庫連接代碼:

sqlite4java 282 
130322:161109.097 FINE [sqlite] Internal: loading library 
130322:161109.099 FINE [sqlite] Internal: java.library.path=/Users/mikey/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. 
130322:161109.100 FINE [sqlite] Internal: sqlite4java.library.path=null 
130322:161109.100 FINE [sqlite] Internal: cwd=/Users/mikey/NetBeansProjects/Test/. 
130322:161109.101 FINE [sqlite] Internal: default path=/Users/mikey/NetBeansProjects/Test/lib 
130322:161109.101 FINE [sqlite] Internal: forced path=null 
130322:161109.102 FINE [sqlite] Internal: os.name=mac os x; os=osx 
130322:161109.102 FINE [sqlite] Internal: os.arch=x86_64 
130322:161109.105 FINE [sqlite] Internal: trying to load sqlite4java-osx-x86_64 
130322:161109.108 FINE [sqlite] Internal: cannot load sqlite4java-osx-x86_64: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64 in java.library.path 
130322:161109.108 FINE [sqlite] Internal: trying to load sqlite4java-osx-amd64 
130322:161109.112 FINE [sqlite] Internal: cannot load sqlite4java-osx-amd64: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-amd64 in java.library.path 
130322:161109.112 FINE [sqlite] Internal: trying to load sqlite4java-osx-10.4 
130322:161109.115 FINE [sqlite] Internal: cannot load sqlite4java-osx-10.4: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-10.4 in java.library.path 
130322:161109.115 FINE [sqlite] Internal: trying to load sqlite4java-osx 
130322:161109.118 FINE [sqlite] Internal: cannot load sqlite4java-osx: java.lang.UnsatisfiedLinkError: no sqlite4java-osx in java.library.path 
130322:161109.119 FINE [sqlite] Internal: trying to load sqlite4java 
130322:161109.122 FINE [sqlite] Internal: cannot load sqlite4java: java.lang.UnsatisfiedLinkError: no sqlite4java in java.library.path 
130322:161109.123 FINE [sqlite] Internal: trying to load sqlite4java-osx-x86_64-d 
130322:161109.127 FINE [sqlite] Internal: cannot load sqlite4java-osx-x86_64-d: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64-d in java.library.path 
130322:161109.127 FINE [sqlite] Internal: trying to load sqlite4java-osx-amd64-d 
130322:161109.131 FINE [sqlite] Internal: cannot load sqlite4java-osx-amd64-d: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-amd64-d in java.library.path 
130322:161109.131 FINE [sqlite] Internal: trying to load sqlite4java-osx-10.4-d 
130322:161109.134 FINE [sqlite] Internal: cannot load sqlite4java-osx-10.4-d: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-10.4-d in java.library.path 
130322:161109.134 FINE [sqlite] Internal: trying to load sqlite4java-osx-d 
130322:161109.137 FINE [sqlite] Internal: cannot load sqlite4java-osx-d: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-d in java.library.path 
130322:161109.138 FINE [sqlite] Internal: trying to load sqlite4java-d 
130322:161109.141 FINE [sqlite] Internal: cannot load sqlite4java-d: java.lang.UnsatisfiedLinkError: no sqlite4java-d in java.library.path 
Error: cannot load SQLite 
java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64 in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:845) 
    at java.lang.System.loadLibrary(System.java:1084) 
    at com.almworks.sqlite4java.Internal.tryLoadFromSystemPath(Internal.java:349) 
    at com.almworks.sqlite4java.Internal.loadLibraryX(Internal.java:124) 
    at com.almworks.sqlite4java.SQLite.main(SQLite.java:368) 
    at frakdeck.Database.<init>(Database.java:19) 
    at frakdeck.Test.start(Test.java:22) 
    at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319) 
    at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:215) 
    at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179) 
    at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76) 
+0

你可以在這個其他堆棧溢出的答案中看到這個問題,它還包括如何根據需要以編程方式設置'java.library.path':http://stackoverflow.com/a/35353377/3679676 – 2016-02-12 03:03:03

回答

4

這是解決方案:

Exception in thread "main" com.almworks.sqlite4java.SQLiteException: 
[-91]cannot load library: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64 
in java.library.path 

請嘗試運行以下命令:

java -jar sqlite4java.jar -d 

,使其嘗試加載的二進制文件的所有變體和驗證結果。

其結果必然是這樣的:

java -jar sqlite4java.jar -d 
sqlite4java 282 
121212:134119.239 FINE [sqlite] Internal: loading library 
121212:134119.239 FINE [sqlite] Internal:java.library.path=/Users/XXXXX/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. 
121212:134119.240 FINE [sqlite] Internal: sqlite4java.library.path=null 
121212:134119.240 FINE [sqlite] Internal: cwd=XXXXX 
121212:134119.240 FINE [sqlite] Internal: default path=XXXXX 
121212:134119.240 FINE [sqlite] Internal: forced path=null 
121212:134119.240 FINE [sqlite] Internal: os.name=mac os x; os=osx 
121212:134119.240 FINE [sqlite] Internal: os.arch=x86_64 
121212:134119.240 FINE [sqlite] Internal: trying to load sqlite4java-osx-x86_64 
121212:134119.243 FINE [sqlite] Internal: cannot load sqlite4java-osx-x86_64: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64 in java.library.path 
121212:134119.243 FINE [sqlite] Internal: trying to load sqlite4java-osx-amd64 
121212:134119.244 FINE [sqlite] Internal: cannot load sqlite4java-osx-amd64:   java.lang.UnsatisfiedLinkError: no sqlite4java-osx-amd64 in java.library.path 
121212:134119.244 FINE [sqlite] Internal: trying to load sqlite4java-osx-10.4 
121212:134119.249 INFO [sqlite] Internal: loaded sqlite4java-osx-10.4 from system path 
121212:134119.252 INFO [sqlite] Internal: loaded sqlite 3.7.10, wrapper 0.2 
SQLite 3.7.10 
Compile-time options: ENABLE_COLUMN_METADATA ENABLE_FTS3 ENABLE_FTS3_PARENTHESIS  ENABLE_LOCKING_STYLE=0 ENABLE_MEMORY_MANAGEMENT ENABLE_RTREE OMIT_DEPRECATED TEMP_STORE=1 THREADSAFE=1 

這些文件試圖更具體的順序不太具體。所以訂單是正確的。

的問題是,有沒有 - 所以我們可能需要重命名libsqlite4java-osx.jniliblibsqlite4java-OSX-amd64.dylib更具體的二進制文件。

+0

我已經在命令行上輸出了類似的內容,我已將它包含在我的問題中,這是我嘗試在NetBeans中的代碼中使用庫,我看到錯誤 – frak 2014-03-04 19:19:38

+1

您必須將libsqlite4java-osx.jnilib重命名爲libsqlite4java-osx-amd64.dylib(對於Mac OSX) – 2014-03-05 09:30:24

+0

噢,我現在看到,這也可以用作解決方案 - 抱歉沒有看到你寫的是正確的 – frak 2014-03-05 18:43:43

0

不知道究竟出了什麼問題,但你可以嘗試從程序內運行sqlite4java的診斷代碼,看看它是否顯示了相同的加載順序:

public Database() { 
    com.almworks.sqlite4java.SQLite.main(new String[] {"-d"}); 
    db = new SQLiteConnection(new File("./test.db")); 
    ... 
+0

我已經添加上面的代碼,可以看到它沒有找到任何庫 - 我可以讓它們在那裏,所以我真的不知道如何繼續...... – frak 2013-03-22 16:16:09

2

升級到Mountain Lion後,我的程序出現同樣的錯誤。當我添加庫到 /庫/ Java /擴展 他的程序運行良好。我不知道這是最好的解決方案,但它工作。

+0

這是我在Eclipse上唯一的工作。謝謝! – Thunderforge 2014-02-23 04:11:41

+0

對不起,當你回答時,我一定錯過了你的答案。它確實有效,但查看輸出結果讓我知道發生了什麼問題...... – frak 2014-03-04 21:02:14

0

我有同樣的問題,但設法通過從IDE創建libs文件夾,然後將該jar複製到新的libs文件夾來加載sqlite。然後,我從構建路徑中刪除舊版本的jar,並添加到新版本中。希望這可以幫助!