Я думаю, что у меня все правильно настроено, но приложение сообщает, что openssl недоступен. Я воспроизведен в простом приложении Spring Boot, но при запуске изображения я получаю следующую Stacktrace: < /p>
java.lang.IllegalArgumentException: Failed to load any of the given libraries: [netty_tcnative_linux_aarch_64, netty_tcnative_linux_aarch_64_fedora, netty_tcnative_aarch_64, netty_tcnative]
at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:114)
at io.netty.handler.ssl.OpenSsl.loadTcNative(OpenSsl.java:716)
at io.netty.handler.ssl.OpenSsl.(OpenSsl.java:110)
at com.example.OpensslTestApplication.main(OpensslTestApplication.java:23)
at java.base@21.0.7/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)
Suppressed: java.lang.UnsatisfiedLinkError: Can't load library: /tmp/libnetty_tcnative_linux_aarch_6413650046406937568812.so
at org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk.NativeLibrarySupport.loadLibraryAbsolute(NativeLibrarySupport.java:100)
at java.base@21.0.7/java.lang.ClassLoader.loadLibrary(ClassLoader.java:114)
at java.base@21.0.7/java.lang.Runtime.load0(Runtime.java:852)
at java.base@21.0.7/java.lang.System.load(System.java:2025)
at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:36)
at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:396)
at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:218)
at io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:105)
... 4 more
Suppressed: java.lang.UnsatisfiedLinkError: Can't load library: /tmp/libnetty_tcnative_linux_aarch_6413650046406937568812.so
at org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk.NativeLibrarySupport.loadLibraryAbsolute(NativeLibrarySupport.java:100)
at java.base@21.0.7/java.lang.ClassLoader.loadLibrary(ClassLoader.java:114)
at java.base@21.0.7/java.lang.Runtime.load0(Runtime.java:852)
at java.base@21.0.7/java.lang.System.load(System.java:2025)
at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:36)
at java.base@21.0.7/java.lang.reflect.Method.invoke(Method.java:580)
at io.netty.util.internal.NativeLibraryLoader$1.run(NativeLibraryLoader.java:430)
at java.base@21.0.7/java.security.AccessController.executePrivileged(AccessController.java:129)
at java.base@21.0.7/java.security.AccessController.doPrivileged(AccessController.java:319)
at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:422)
at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:388)
... 6 more
< /code>
Я использовал журнал ресурсов (-H:Log=registerResource:3), чтобы убедиться, что Meta-Inf/native/libnetty_tcnative_linux_aarch_64.so включена, и из того, что я понимаю, тот факт, что он пытается загрузить этот файл из/tmp с помощью некоторой случайной строки, добавленной, означает, что он смог найти этот файл в банке и извлечь его в/tmp. Я строю на своем M2 MacBook Air и использую рабочие столы Rancher. Должно быть возможно использовать Native OpenSSL в нативном изображении GraAlvm, верно?@SpringBootApplication
@ImportRuntimeHints(OpensslTestApplication.NettyNativeRuntimeHints.class)
public class OpensslTestApplication {
public static void main(String[] args) {
System.setProperty("io.netty.native.workdir", "/tmp");
if (!OpenSsl.isAvailable()) {
System.err.println("
OpenSsl.unavailabilityCause().printStackTrace();
} else {
System.out.println("
}
SpringApplication.run(OpensslTestApplication.class, args);
}
static class NettyNativeRuntimeHints implements RuntimeHintsRegistrar {
@Override
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
hints.jni().registerType(OpenSsl.class);
hints.resources().registerPattern("META-INF/native/libnetty_tcnative_linux_aarch_64.so");
hints.resources().registerPattern("test.p12");
}
}
@Bean
RouterFunction route() {
return RouterFunctions.route(RequestPredicates.GET("/"), req ->
ServerResponse.ok().body(Mono.just("Hello from native SSL!"), String.class)
);
}
}
< /code>
build.gradle:
import org.springframework.boot.gradle.plugin.SpringBootPlugin
plugins {
id 'java'
id 'org.springframework.boot' version '3.5.3'
id 'org.graalvm.buildtools.native' version '0.10.6'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation platform(SpringBootPlugin.BOM_COORDINATES)
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation("io.netty:netty-tcnative-boringssl-static:2.0.72.Final:linux-aarch_64")
// Adding this makes OpenSSL available during aot processing when buliding on macos, not sure if necessary
implementation("io.netty:netty-tcnative-boringssl-static:2.0.72.Final:osx-aarch_64")
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... tive-image