GraalVM 本机映像在 IDE (java17) 中工作,但在构建本机映像时不起作用

问题描述 投票:0回答:1

我有一个 spring shell 应用程序,它可以执行非常简单的操作,例如从终端发送 get 请求。

pom.xml 依赖项

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
      <groupId>org.springframework.shell</groupId>
      <artifactId>spring-shell-starter</artifactId>
</dependency>

当我使用标准 java17 构建它或通过 IDE 运行它时,它工作得非常好。 但是当我构建一个本机图像并尝试运行相同的功能时,我得到了

Exception in thread "main" java.lang.ExceptionInInitializerError
        at io.netty.resolver.dns.DnsServerAddressStreamProviders$DefaultProviderHolder$1.provider(DnsServerAddressStreamProviders.java:150)
        at io.netty.resolver.dns.DnsServerAddressStreamProviders$DefaultProviderHolder$1.<init>(DnsServerAddressStreamProviders.java:130)
        at io.netty.resolver.dns.DnsServerAddressStreamProviders$DefaultProviderHolder.<clinit>(DnsServerAddressStreamProviders.java:128)
        at io.netty.resolver.dns.DnsServerAddressStreamProviders.unixDefault(DnsServerAddressStreamProviders.java:117)
        at io.netty.resolver.dns.DnsServerAddressStreamProviders.platformDefault(DnsServerAddressStreamProviders.java:113)
        at io.netty.resolver.dns.DnsNameResolverBuilder.<init>(DnsNameResolverBuilder.java:67)
        at reactor.netty.transport.NameResolverProvider.newNameResolverGroup(NameResolverProvider.java:541)
        at reactor.netty.tcp.TcpResources.getOrCreateDefaultResolver(TcpResources.java:315)
        at reactor.netty.http.HttpResources.getOrCreateDefaultResolver(HttpResources.java:162)
        at reactor.netty.http.client.HttpClientConfig.defaultAddressResolverGroup(HttpClientConfig.java:406)
        at reactor.netty.transport.ClientTransportConfig.resolverInternal(ClientTransportConfig.java:228)
        at reactor.netty.http.client.HttpClientConfig.resolverInternal(HttpClientConfig.java:460)
        at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.lambda$subscribe$0(HttpClientConnect.java:269)
        at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:61)
        at reactor.core.publisher.FluxRetryWhen.subscribe(FluxRetryWhen.java:80)
        at reactor.core.publisher.MonoRetryWhen.subscribeOrReturn(MonoRetryWhen.java:46)
        at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:63)
        at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.subscribe(HttpClientConnect.java:276)
        at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76)
        at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:55)
        at reactor.core.publisher.Mono.subscribe(Mono.java:4512)
        at reactor.core.publisher.Mono.block(Mono.java:1727)
        at nabil.req.commands.HttpCommands.request(HttpCommands.java:36)
        at nabil.req.commands.HttpCommands.get(HttpCommands.java:44)
        at [email protected]/java.lang.reflect.Method.invoke(Method.java:568)
        at org.springframework.shell.command.invocation.InvocableShellMethod.doInvoke(InvocableShellMethod.java:306)
        at org.springframework.shell.command.invocation.InvocableShellMethod.invoke(InvocableShellMethod.java:232)
        at org.springframework.shell.command.CommandExecution$DefaultCommandExecution.evaluate(CommandExecution.java:227)
        at org.springframework.shell.Shell.evaluate(Shell.java:248)
        at org.springframework.shell.Shell.run(Shell.java:159)
        at org.springframework.shell.jline.NonInteractiveShellRunner.run(NonInteractiveShellRunner.java:146)
        at org.springframework.shell.DefaultShellApplicationRunner.run(DefaultShellApplicationRunner.java:65)
        at org.springframework.boot.SpringApplication.lambda$callRunner$4(SpringApplication.java:794)
        at org.springframework.util.function.ThrowingConsumer$1.acceptWithException(ThrowingConsumer.java:83)
        at org.springframework.util.function.ThrowingConsumer.accept(ThrowingConsumer.java:60)
        at org.springframework.util.function.ThrowingConsumer$1.accept(ThrowingConsumer.java:88)
        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:806)
        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:794)
        at org.springframework.boot.SpringApplication.lambda$callRunners$3(SpringApplication.java:782)
        at [email protected]/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
        at [email protected]/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
        at [email protected]/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)
        at [email protected]/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at [email protected]/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
        at [email protected]/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
        at [email protected]/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at [email protected]/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
        at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:782)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:341)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1358)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1347)
        at nabil.req.ReqApplication.main(ReqApplication.java:12)
Caused by: java.lang.NullPointerException
        at [email protected]/sun.net.dns.ResolverConfigurationImpl.stringToList(ResolverConfigurationImpl.java:69)
        at [email protected]/sun.net.dns.ResolverConfigurationImpl.loadConfig(ResolverConfigurationImpl.java:136)
        at [email protected]/sun.net.dns.ResolverConfigurationImpl.nameservers(ResolverConfigurationImpl.java:159)
        at [email protected]/com.sun.jndi.dns.DnsContextFactory.serversForUrls(DnsContextFactory.java:149)
        at [email protected]/com.sun.jndi.dns.DnsContextFactory.getContext(DnsContextFactory.java:81)
        at [email protected]/com.sun.jndi.dns.DnsContextFactory.urlToContext(DnsContextFactory.java:120)
        at [email protected]/com.sun.jndi.dns.DnsContextFactory.getInitialContext(DnsContextFactory.java:64)
        at [email protected]/javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:732)
        at [email protected]/javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:305)
        at [email protected]/javax.naming.InitialContext.init(InitialContext.java:236)
        at [email protected]/javax.naming.InitialContext.<init>(InitialContext.java:208)
        at [email protected]/javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:130)
        at io.netty.resolver.dns.DirContextUtils.addNameServers(DirContextUtils.java:49)
        at io.netty.resolver.dns.DefaultDnsServerAddressStreamProvider.<clinit>(DefaultDnsServerAddressStreamProvider.java:55)
        ... 52 more

我可以肯定地说,这与本机映像构建有关。但不知何故找不到解决方案。

spring-webflux graalvm graalvm-native-image spring-shell
1个回答
0
投票

对于某些操作系统来说,这似乎是一个“已知问题”。 根据

this

回复,解决方法是使用以下jni-config.json元数据文件(此文件必须放在

META-INF/native-image
中)
[
  {
    "name":"sun.net.dns.ResolverConfigurationImpl",
    "fields":[
      {"name":"os_searchlist"},
      {"name":"os_nameservers"}
    ]
  }
]

--initialize-at-run-time=sun.net.dns.ResolverConfigurationImpl

结合
    

© www.soinside.com 2019 - 2024. All rights reserved.