2

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

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

请参阅下面的 gradle.build 和控制台输出:

gradle.build

应用插件:'java'

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

// NetBeans 将根据“mainClass”属性自动添加“运行”和“调试”任务。但是,您可以在执行 // 任务之前通过传递“-PmainClass=" 参数来定义属性。// // 但是请注意,如果您愿意,您可以定义自己的“运行”和“调试”任务。在这种情况下,NetBeans 不会添加这些任务,但您可以依赖 // 您自己的实现。if (!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\???\Documents\NetBeansProjects\Falcon3\settings.gradle]

_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) at com.cloudant.sync.internal.sqlite.SQLDatabaseFactory.(SQLDatabaseFactory.java:45) ... 15 更多原因:com.almworks。

FAILURE:构建失败并出现异常。

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

    Process 'command 'C:\Program Files\Java\jdk1.8.0_102\bin\java.exe'' 以非零退出值 1 结束

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

构建失败

总时间:2.578 秒

构建失败(请参阅堆栈跟踪的通知窗口):gradle run

4

2 回答 2

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() {

    }
}
于 2018-09-25T06:16:19.753 回答
0

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

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

尝试添加另一个依赖项:

runtime group: 'com.almworks.sqlite4java', name: 'sqlite4java-win32-x64', version: '1.0.392'
于 2017-02-11T12:50:53.363 回答