我正在使用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 运行
答案 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() {
}
}