UnsatisfiedLinkError用在Mac OS X中使用NetBeans

问题描述:

我正经历着类似的问题,这个问题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

这是解决方案:

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

不知道究竟出了什么问题,但你可以尝试从程序内运行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

升级到Mountain Lion后,我的程序出现同样的错误。当我添加库到 /库/ Java /扩展 他的程序运行良好。我不知道这是最好的解决方案,但它工作。

+0

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

+0

对不起,当你回答时,我一定错过了你的答案。它确实有效,但查看输出结果让我知道发生了什么问题...... – frak 2014-03-04 21:02:14

我有同样的问题,但设法通过从IDE创建libs文件夹,然后将该jar复制到新的libs文件夹来加载sqlite。然后,我从构建路径中删除旧版本的jar,并添加到新版本中。希望这可以帮助!