我在 Linux 中使用 Gluonhq 和 JDBC。
版本信息:“GraalVM 22.1.0.1 Java 17 CE”
postgresql没有问题。当我使用 sqlite 时,问题就开始了。
我的 JDBC 连接:
Connection connection = DriverManager.getConnection(
"jdbc:sqlite:/home/alex/IdeaProjects/db/base/materials.db"
);
我愿意
mvn clean gluonfx:runagent
一切正常,从sqlite数据库读取数据。
那我就做
mvn clean gluonfx:build
我得到了
java.lang.NoClassDefFoundError:org/graalvm/nativeimage/hosted/RuntimeResourceAccess org.sqlite.nativeimage.SqliteJdbcFeature.handleLibraryResources(SqliteJdbcFeature.java:54) 引起原因:java.lang.ClassNotFoundException:org.graalvm.nativeimage.hosted.RuntimeResourceAccess
我添加了
<nativeImageArgs>
<arg>-Dorg.sqlite.lib.exportPath=/home/alex/IdeaProjects/</arg>
</nativeImageArgs>
又出现新错误
java.lang.NoClassDefFoundError:org/graalvm/nativeimage/hosted/RuntimeJNIAccess org.sqlite.nativeimage.SqliteJdbcFeature.registerJNICalls(SqliteJdbcFeature.java:70 导致:java.lang.ClassNotFoundException:org.graalvm.nativeimage.hosted.RuntimeJNIAccess
SqliteJdbcFeature.java第70行: RuntimeJNIAccess.register(NativeDB.class);
我检查了jni-config.json
{
"name":"org.sqlite.core.DB",
"methods":[
{"name":"onCommit","parameterTypes":["boolean"] },
{"name":"onUpdate","parameterTypes":["int","java.lang.String","java.lang.String","long"] },
{"name":"throwex","parameterTypes":[] },
{"name":"throwex","parameterTypes":["int"] }
]
},
{
"name":"org.sqlite.core.DB$ProgressObserver",
"methods":[{"name":"progress","parameterTypes":["int","int"] }]
},
{
"name":"org.sqlite.core.NativeDB",
"fields":[
{"name":"busyHandler"},
{"name":"commitListener"},
{"name":"pointer"},
{"name":"progressHandler"},
{"name":"updateListener"}
],
"methods":[
{"name":"stringToUtf8ByteArray","parameterTypes":["java.lang.String"] },
{"name":"throwex","parameterTypes":["java.lang.String"] }
]
}, ...
救命!!
我通过替换依赖项重新解决了我的问题
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.42.0.0</version>
</dependency>
女巫
<dependency>
<groupId>io.github.willena</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.35.5.3</version>
</dependency>