我正在使用netbeans ide(win7)开发一个基于gradle的小型javafx项目。在我包括cloudant sync和sqlite4java之前,一切都很好,现在每当我运行项目时,我都会得到不满意的链接错误。请告诉我该如何解决这个问题。
java.lang.UnsisfiedLinkError:java.library.path 中没有sqlite4java-win32-x64-1.0.392
请参阅下面的grade.build和控制台输出:
gradle.build
应用插件:'java'
sourceCompatibility="1.8"[compileJava,compileTestJava].options.encoding='UTF-8'
//NetBeans将自动添加依赖于//"mainClass"属性。但是,您可以在通过传递"-PmainClass="执行//任务参数。////但是,请注意,您可以定义自己的"跑步"one_answers"调试"任务(如果您愿意)。在这种情况下,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项目:aquafx:0.2'testCompile组:"junit",名称:"junist",版本:"4.10"}
和
控制台输出
正在执行:gradle run参数:[-c,C: \用户\???\Documents\NetBeansProjects\Falcon3\settings.gradle]
:compileJava更新日期:processResources更新日期:classes截止日期2017年2月11日上午11:57:23 com.almworks.sqlite4java.国际日志信息:[sqlite]DB[1]:实例化的[null]应用程序中出现异常在处启动方法java.lang.reflect.InvocationTargetException位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)位于java.lang.reflect.Method.ioke(Method.java:498)com.sun.javafx.application.LaunchImpl.launchApplicationWithArgs(LauncherImpl.java:389)在com.sun.javafx.application.LaunchImpl.launchApplication(LauncherImpl.java:328)位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)位于java.lang.reflect.Method.ioke(Method.java:498)sun.selauncher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)引起原因:java.lang.RuntimeException:应用程序启动时出现异常方法com.sun.javafx.application.LaunchImpl.launchApplication1(LauncherImpl.java:917)在com.sun.javafx.application.LaunchImpl.lambda$launchApplication$155(LauncherImpl.java:182)在java.lang.Thread.run(Thread.java:745)由以下原因引起:java.lang.ExceptionInInitializerError位于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)com.sun.javafx.application.LaunchImpl.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(本机方法)com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)在com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterCispatcher.java:95)网址:com.sun.glass.ui.win.WinApplication_runLoop(Native Method)com.sun.glass.ui.win.WinApplicationLambda$null$148(WinApplication.java:191)…还有1个原因:java.lang.IollegalStateException:无法打开数据库在com.cloudant.sync.internal.sqlite.sqlite4java.SQLiteWrapper.createNewConnection(SQLiteWraper.java:92)在com.cloudant.sync.internal.sqlite.sqlite4java.SQLiteWrapper.getConnection(SQLiteWraper.java:73)在com.cloudant.sync.internal.sqlite.sqlite4java.SQLiteWrapper.isOpen(SQLiteWraper.java:121)在com.cloudant.sync.internal.sqlite.sqlite4java.SQLiteWrapper.beginTransaction(SQLiteWraper.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.UnsisfiedLinkError:nojava.library.path中的sqlite4java-win32-x64-1.0.392com.almworks.sqlite4java.SQLite.loadLibrary(SQLite.java:97)com.almworks.sqlite4java.SQLiteConnection.open0(SQLiteConnection.java:1441)在com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:282)在com.cloudant.sync.internal.sqlite.sqlite4java.SQLiteWrapper.createNewConnection(SQLiteWraper.java:88)…还有20个原因:java.lang.UnsisfiedLinkError:nojava.library.path中的sqlite4java-win32-x64-1.0.392java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)java.lang.Runtime.loadLibrary0(Runtime.java:870)java.lang.System.loadLibrary(System.java:1122)位于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的异常:运行失败的
失败:生成失败,出现异常。
出了什么问题:任务":运行"的执行失败。
进程"命令"C:\Program Files\Java\jdk1.8.0_102\bin\Java.exe"以非零退出值1 完成
Try:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获得更多日志输出。
BUILD FAILED
总时间:2.578秒
生成失败(请参阅堆栈跟踪的"通知"窗口):gradle运行
sqlite4java不是一个纯Java包,但需要实际SQLite库的二进制构建。JVM必须在运行时可以使用此功能。sqlite4java文档中写道:
要开始使用sqlite4java,只需要将sqlite4java.jar和依赖于平台的二进制文件放在CLASSPATH中的一个目录中。(二进制文件应该与jar文件在同一目录中。)
尝试添加另一个依赖项:
runtime group: 'com.almworks.sqlite4java', name: 'sqlite4java-win32-x64', version: '1.0.392'
这个答案帮助了我: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() {
}
}