Quarkus 本机,无法使用 Maven 依赖项中的共享库
Quarkus native, not able to use a shared library from maven dependency
我正在尝试使用 Graalvm 建立一个 Quarkus 服务器,该服务器具有加载共享库(*.so 文件)的 Maven 依赖项。
但是,在服务器启动后,我得到一个 java.lang.UnsatisfiedLinkError.
重现问题的步骤
git clone https://github.com/ricardocunha/h3-native-test
mvn clean package -DskipTests && docker build -f src/main/docker/Dockerfile.native -t quarkus/h3-test . && docker run -i --rm -p 8080:8080 quarkus/h3-test
GraalVM 和环境:
GraalVM GraalVM 21.3.0
- JDK 主要版本:11
- OS:Linux(准确的说是Ubuntu20.04)
- 架构:AMD64
更多详情
当前错误
- java.lang.UnsatisfiedLinkError:无法加载库:/tmp/libh3-java.so
然而,File.canRead returns 是正确的。所以,我不明白发生了什么。
编译命令为:
native-image -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager -J-Dsun.nio.ch.maxUpdateArraySize=100 -J-Dvertx.logger-delegate-factory-class-name=io.quarkus.vertx.core.runtime.VertxLogDelegateFactory -J-Dvertx.disableDnsResolver=true -J-Dio.netty.leakDetection.level=DISABLED -J-Dio.netty.allocator.maxOrder=3 -J-Duser.language=en -J-Duser.country=US -J-Dfile.encoding=UTF-8 -H:-ParseOnce -J--add-exports=java.security.jgss/sun.security.krb5=ALL-UNNAMED -J--add-opens=java.base/java.text=ALL-UNNAMED -H:ResourceConfigurationFiles=resource-config.json -H:+PrintClassInitialization --allow-incomplete-classpath -H:+JNI -Djava.library.path=/tmp -H:JNIConfigurationResources=jniconfig.json -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy$BySpaceAndTime -H:+JNI -H:+AllowFoldMethods -J-Djava.awt.headless=true -H:FallbackThreshold=0 -H:+ReportExceptionStackTraces -H:-AddAllCharsets -H:EnableURLProtocols=http -H:NativeLinkerOption=-no-pie -H:-UseServiceLoaderFeature -H:+StackTrace h3-native-test-1.0.0-SNAPSHOT-runner -jar h3-native-test-1.0.0-SNAPSHOT-runner.jar```
所以,在尝试 运行 作为非本地人之后,错误很明显:
java.lang.UnsatisfiedLinkError: /usr/lib/libh3-java.so: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by /usr/lib/libh3-java.so)
运行 作为本机没有关于 GLIBC_2.29 的信息未找到。这个库是一个非常核心的库,所以我决定从 docker image quarkus-micro-image:1.0(GLIBC 2.28) 移动到 openjdk:11 作为基础图像,因为它是 2.31。 Ubi-9 目前处于测试阶段。
我正在尝试使用 Graalvm 建立一个 Quarkus 服务器,该服务器具有加载共享库(*.so 文件)的 Maven 依赖项。 但是,在服务器启动后,我得到一个 java.lang.UnsatisfiedLinkError.
重现问题的步骤
git clone https://github.com/ricardocunha/h3-native-test
mvn clean package -DskipTests && docker build -f src/main/docker/Dockerfile.native -t quarkus/h3-test . && docker run -i --rm -p 8080:8080 quarkus/h3-test
GraalVM 和环境:
GraalVM GraalVM 21.3.0
- JDK 主要版本:11
- OS:Linux(准确的说是Ubuntu20.04)
- 架构:AMD64
更多详情
当前错误
- java.lang.UnsatisfiedLinkError:无法加载库:/tmp/libh3-java.so
然而,File.canRead returns 是正确的。所以,我不明白发生了什么。
编译命令为:
native-image -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager -J-Dsun.nio.ch.maxUpdateArraySize=100 -J-Dvertx.logger-delegate-factory-class-name=io.quarkus.vertx.core.runtime.VertxLogDelegateFactory -J-Dvertx.disableDnsResolver=true -J-Dio.netty.leakDetection.level=DISABLED -J-Dio.netty.allocator.maxOrder=3 -J-Duser.language=en -J-Duser.country=US -J-Dfile.encoding=UTF-8 -H:-ParseOnce -J--add-exports=java.security.jgss/sun.security.krb5=ALL-UNNAMED -J--add-opens=java.base/java.text=ALL-UNNAMED -H:ResourceConfigurationFiles=resource-config.json -H:+PrintClassInitialization --allow-incomplete-classpath -H:+JNI -Djava.library.path=/tmp -H:JNIConfigurationResources=jniconfig.json -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy$BySpaceAndTime -H:+JNI -H:+AllowFoldMethods -J-Djava.awt.headless=true -H:FallbackThreshold=0 -H:+ReportExceptionStackTraces -H:-AddAllCharsets -H:EnableURLProtocols=http -H:NativeLinkerOption=-no-pie -H:-UseServiceLoaderFeature -H:+StackTrace h3-native-test-1.0.0-SNAPSHOT-runner -jar h3-native-test-1.0.0-SNAPSHOT-runner.jar```
所以,在尝试 运行 作为非本地人之后,错误很明显:
java.lang.UnsatisfiedLinkError: /usr/lib/libh3-java.so: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by /usr/lib/libh3-java.so)
运行 作为本机没有关于 GLIBC_2.29 的信息未找到。这个库是一个非常核心的库,所以我决定从 docker image quarkus-micro-image:1.0(GLIBC 2.28) 移动到 openjdk:11 作为基础图像,因为它是 2.31。 Ubi-9 目前处于测试阶段。