java.lang.UnsatisfiedLinkError:java.library.path中没有sqlite4java-win32-x64-1.0.392 - 基于gradle的javafx

时间:2017-02-11 12:40:26

标签: java netbeans cloudant sqlite4java

我正在使用netbeans ide(win7)开发基于小型gradle的javafx项目。一切正常,直到我包括cloudant-sync和sqlite4java,现在每当我运行项目时我都会收到UnsatisfiedLinkError。请问我该如何解决这个问题。

  

java.lang.UnsatisfiedLinkError:java.library.path中没有sqlite4java-win32-x64-1.0.392

请参阅下面的gradle.build和console输出:

  

gradle.build

     

申请插件:' java'

     

sourceCompatibility =' 1.8' [compileJava,   compileTestJava] .options .encoding =' UTF-8'

     

// NetBeans将自动添加"运行"和"调试"依赖的任务   //" mainClass"属性。但您可以事先定义该属性   通过传递" -PmainClass ="来执行//任务   论点。 // //但是请注意,您可以定义自己的"运行"和   "调试"任务,如果你喜欢。在这种情况下,NetBeans不会添加   这些任务,但你可能依赖于//你自己的实现。如果   (!hasProperty(' mainClass')){       ext.mainClass =' falcon3.Main' }

     

知识库{       mavenCentral()}

     

依赖{       编译' com.jfoenix:jfoenix:1.1.0'       编译组:' com.cloudant',名称:' cloudant-sync-datastore-javase',版本:' 2.0.0'       编译组:' com.almworks.sqlite4java',名称:' sqlite4java',版本:' 1.0.392'       编译' com.aquafx-project:aquafx:0.2'       testCompile组:' junit',名称:' junit',版本:' 4.10' }

  

控制台输出

     

执行:gradle run参数:[ - c,   C:\ Users \用户??? \文件\的NetBeansProjects \ Falcon3 \ settings.gradle]

     

:compileJava UP-TO-DATE:processResources UP-TO-DATE:classes   最新日期2017年2月11日上午11:57:23 com.almworks.sqlite4java.Internal   log INFO:[sqlite] DB [1]:instantiated [null] Application中的异常   启动方法java.lang.reflect.InvocationTargetException at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:498)at   com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)     在   com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:498)at   sun.launcher.LauncherHelper $ FXHelper.main(LauncherHelper.java:767)   引起:java.lang.RuntimeException:Application start中的异常   方法   com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)     在   com.sun.javafx.application.LauncherImpl.lambda $ launchApplication $ 155(LauncherImpl.java:182)     在java.lang.Thread.run(Thread.java:745)引起:   java.lang.ExceptionInInitializerError at   com.cloudant.sync.internal.sqlite.SQLDatabaseQueue。(SQLDatabaseQueue.java:67)     在   com.cloudant.sync.internal.documentstore.DatabaseImpl。(DatabaseImpl.java:152)     在   com.cloudant.sync.documentstore.DocumentStore。(DocumentStore.java:90)     在   com.cloudant.sync.documentstore.DocumentStore.getInstance(DocumentStore.java:150)     在   com.cloudant.sync.documentstore.DocumentStore.getInstance(DocumentStore.java:120)     在falcon3.Main.start(Main.java:28)at   com.sun.javafx.application.LauncherImpl.lambda $ launchApplication1 $ 162(LauncherImpl.java:863)     在   com.sun.javafx.application.PlatformImpl.lambda $ runAndWait $ 175(PlatformImpl.java:326)     在   com.sun.javafx.application.PlatformImpl.lambda为$ null $ 173(PlatformImpl.java:295)     在java.security.AccessController.doPrivileged(Native Method)at   com.sun.javafx.application.PlatformImpl.lambda $ runLater $ 174(PlatformImpl.java:294)     在   com.sun.glass.ui.InvokeLaterDispatcher $ Future.run(InvokeLaterDispatcher.java:95)     at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)at   com.sun.glass.ui.win.WinApplication.lambda为$ null $ 148(WinApplication.java:191)     ... 1更多引起:java.lang.IllegalStateException:无法打开   数据库。在   com.cloudant.sync.internal.sqlite.sqlite4java.SQLiteWrapper.createNewConnection(SQLiteWrapper.java:92)     在   com.cloudant.sync.internal.sqlite.sqlite4java.SQLiteWrapper.getConnection(SQLiteWrapper.java:73)     在   com.cloudant.sync.internal.sqlite.sqlite4java.SQLiteWrapper.isOpen(SQLiteWrapper.java:121)     在   com.cloudant.sync.internal.sqlite.sqlite4java.SQLiteWrapper.beginTransaction(SQLiteWrapper.java:126)     在   com.cloudant.sync.internal.sqlite.SQLDatabaseFactory.isFtsAvailable(SQLDatabaseFactory.java:52)     在   com.cloudant.sync.internal.sqlite.SQLDatabaseFactory。(SQLDatabaseFactory.java:45)     ... 15更多引起:com.almworks.sqlite4java.SQLiteException:   [-91]无法加载库:java.lang.UnsatisfiedLinkError:no   java.library.path中的sqlite4java-win32-x64-1.0.392   com.almworks.sqlite4java.SQLite.loadLibrary(SQLite.java:97)at   com.almworks.sqlite4java.SQLiteConnection.open0(SQLiteConnection.java:1441)     在   com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:282)     在   com.cloudant.sync.internal.sqlite.sqlite4java.SQLiteWrapper.createNewConnection(SQLiteWrapper.java:88)     ... 20更多引起:java.lang.UnsatisfiedLinkError:没有   java.library.path中的sqlite4java-win32-x64-1.0.392   java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)at   java.lang.Runtime.loadLibrary0(Runtime.java:870)at   java.lang.System.loadLibrary(System.java:1122)at   com.almworks.sqlite4java.Internal.tryLoadFromSystemPath(Internal.java:352)     在com.almworks.sqlite4java.Internal.loadLibraryX(Internal.java:124)     在com.almworks.sqlite4java.SQLite.loadLibrary(SQLite.java:95)...   23更多异常运行应用程序falcon3.Main:运行FAILED

     

失败:构建因异常而失败。

     
      
  • 出了什么问题:任务执行失败':运行'。

         
        

    进程'命令' C:\ Program Files \ Java \ jdk1.8.0_102 \ bin \ java.exe''完成非零退出值1

      
  •   
  • 尝试:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获得更多日志输出。

  •   
     

建立失败

     

总时间:2.578秒

     

构建失败(请参阅stacktrace的Notifications窗口):gradle   运行

2 个答案:

答案 0 :(得分:0)

sqlite4java不是纯Java包,但需要实际SQLite库的二进制构建。这必须在运行时可供JVM使用。 sqlite4java文档说:

  

要开始使用sqlite4java,您只需将sqlite4java.jar和依赖于平台的二进制文件放入CLASSPATH中的目录中。 (二进制文件应与jar文件位于同一目录中。)

尝试添加其他依赖项:

runtime group: 'com.almworks.sqlite4java', name: 'sqlite4java-win32-x64', version: '1.0.392'

答案 1 :(得分:0)

此答案对我有帮助:https://stackoverflow.com/a/39086207/3887715

尽管答案是基于DynamoDBLocal的,但您已经包含了sqlite4java依赖项,因此您应该能够在类似的设置下使用它。

您需要将库文件复制到另一个目录:

task copyNativeDeps(type: Copy) {
    from(configurations.compile + configurations.testCompile) {
        include '*.dll'
        include '*.dylib'
        include '*.so'
    }
    into 'build/libs'
}

然后将系统属性sqlite4java.library.path设置到该目录的路径。就我而言,我需要它进行测试,因此我只是在测试类中添加了一个初始化程序块:

public class CreateDynamoDBTest {
    {
        System.setProperty("sqlite4java.library.path", "build/libs");
    }

    @Test
    public void test() {

    }
}