我有一个简单的 SpringBoot 3.3.4 应用程序 - Java v17、Gradle v8.10,我正在尝试一项基本任务,使用 Hikari 打开连接池,针对 MySQL 数据库运行几个 SQL 选择。我可以使用以下方式进行编译:
./gradlew nativeCompile
在配备 M3“arm64 芯片”的 Apple Mac 上运行
我已经在我的网站上上传了Java代码-SpringBoot项目:
https://jesusbianco.com/stackoverflow/Test1-Native-Data-MySQL.zip
代码编译 - 原生代码没有问题:
https://jesusbianco.com/stackoverflow/compile.txt
运行时的错误可从以下链接获取:
https://jesusbianco.com/stackoverflow/errors.txt
代码无法正常运行,启动时崩溃,某些类无法加载/找到,我猜是因为Java的反射?
如果在文件末尾修改了 build.gradle 文件,则启用这些行:
jar {
archiveClassifier=''
enabled = false
duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
}
然后使用 Gradle 构建并运行应用程序:
gradle clean build
java -jar build/libs/test1-native-data-mysql-3.0.jar
使用 JVM 运行良好。
当前的问题是在不使用 JVM 的情况下运行本机映像“二进制代码”。我有另一个项目,更简单,我可以运行本机代码,但是这个使用 Hikari 和 MySQL JDBC 驱动程序的项目已损坏:-(
Graal 依赖于 https://github.com/oracle/graalvm-reachability-metadata 提供的可达性元数据来支持反射。在这种情况下,元数据似乎不完整。具体来说,
config.addDataSourceProperty("cachePrepStmts", "true");
调用会触发失败的代码路径。
如果您注释掉这些行,您的应用程序就会通过。
我已经打开 https://github.com/oracle/graalvm-reachability-metadata/issues/549 看看 Oracle 团队是否可以修复元数据。该问题还有一个您可以同时使用的解决方法。