question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Performing native image compilation with netty and slf4j results in UnsupportedFeatureException

See original GitHub issue

Expected behavior

Native image compilation succeeds at build-time without the need for extra configurations.

Actual behavior

Performing native image compilation on a project that contains just io.netty:netty-all and slf4j results in UnsupportedFeatureException at build-time.

Steps to reproduce

Reproducer: https://github.com/BenWhitehead/graalvm-netty-slf4j-repro

  1. Clone the repo linked above
  2. Comment out the native-image.properties configurations at https://github.com/BenWhitehead/graalvm-netty-slf4j-repro/blob/main/src/main/resources/META-INF/native-image/native-image.properties
  3. Call mvn clean install
  4. Call mvn package -Pnative
  5. See the following error:
[1/7] Initializing...                                                          (4.2s @ 0.23GB)
 Version info: 'GraalVM 22.3.0 Java 11 CE'
 Java version info: '11.0.17+8-jvmci-22.3-b08'
 C compiler: gcc (linux, x86_64, 12.2.0)
 Garbage collector: Serial GC
[2/7] Performing analysis...  [WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:${HOME}/.m2/repository/io/netty/netty-common/4.1.84.Final/netty-common-4.1.84.Final.jar) to constructor java.nio.DirectByteBuffer(long,int)
WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
]                                               (2.1s @ 0.37GB)
   1,534 (60.25%) of  2,546 classes reachable
   1,313 (41.34%) of  3,176 fields reachable
   4,970 (59.15%) of  8,403 methods reachable
      22 classes,     0 fields, and     0 methods registered for reflection

Fatal error: com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing io.netty.channel.nio.AbstractNioChannel.<init>(io.netty.channel.Channel, java.nio.channels.SelectableChannel, int) 
Parsing context:
   at io.netty.channel.nio.AbstractNioChannel.<init>(AbstractNioChannel.java:80)
   at io.netty.channel.nio.AbstractNioMessageChannel.<init>(AbstractNioMessageChannel.java:42)

	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:153)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.createFlowsGraph(MethodTypeFlow.java:104)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureFlowsGraphCreated(MethodTypeFlow.java:83)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.getOrCreateMethodFlowsGraph(MethodTypeFlow.java:65)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.typestate.DefaultSpecialInvokeTypeFlow.onObservedUpdate(DefaultSpecialInvokeTypeFlow.java:61)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:562)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.PointsToAnalysis$1.run(PointsToAnalysis.java:488)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.CompletionExecutor.executeCommand(CompletionExecutor.java:193)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.CompletionExecutor.lambda$executeService$0(CompletionExecutor.java:177)
	at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
Caused by: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: No instances of org.slf4j.jul.JDK14LoggerAdapter are allowed in the image heap as this class should be initialized at image runtime. To see how this object got instantiated use --trace-object-instantiation=org.slf4j.jul.JDK14LoggerAdapter.
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.ClassInitializationFeature.checkImageHeapInstance(ClassInitializationFeature.java:132)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.meta.AnalysisUniverse.replaceObject(AnalysisUniverse.java:595)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.ameta.AnalysisConstantReflectionProvider.replaceObject(AnalysisConstantReflectionProvider.java:177)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.ameta.AnalysisConstantReflectionProvider.interceptValue(AnalysisConstantReflectionProvider.java:148)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.ameta.AnalysisConstantReflectionProvider.readValue(AnalysisConstantReflectionProvider.java:100)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.ameta.AnalysisConstantReflectionProvider.readFieldValue(AnalysisConstantReflectionProvider.java:79)
	at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.util.ConstantFoldUtil$1.readValue(ConstantFoldUtil.java:55)
	at jdk.internal.vm.compiler/org.graalvm.compiler.core.common.spi.JavaConstantFieldProvider.readConstantField(JavaConstantFieldProvider.java:78)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.ameta.AnalysisConstantFieldProvider.readConstantField(AnalysisConstantFieldProvider.java:72)
	at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.util.ConstantFoldUtil.tryConstantFold(ConstantFoldUtil.java:51)
	at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.java.LoadFieldNode.asConstant(LoadFieldNode.java:178)
	at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.java.LoadFieldNode.canonical(LoadFieldNode.java:144)
	at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.java.LoadFieldNode.canonical(LoadFieldNode.java:135)
	at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.java.LoadFieldNode.canonical(LoadFieldNode.java:72)
	at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.spi.Canonicalizable$Unary.canonical(Canonicalizable.java:101)
	at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.SimplifyingGraphDecoder.canonicalizeFixedNode(SimplifyingGraphDecoder.java:214)
	at jdk.internal.vm.compiler/org.graalvm.compiler.replacements.PEGraphDecoder.canonicalizeFixedNode(PEGraphDecoder.java:1572)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.phases.InlineBeforeAnalysisGraphDecoder.canonicalizeFixedNode(InlineBeforeAnalysis.java:192)
	at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.SimplifyingGraphDecoder.handleFixedNode(SimplifyingGraphDecoder.java:193)
	at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.GraphDecoder.processNextNode(GraphDecoder.java:821)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.phases.InlineBeforeAnalysisGraphDecoder.processNextNode(InlineBeforeAnalysis.java:240)
	at jdk.internal.vm.compiler/org.graalvm.compiler.nodes.GraphDecoder.decode(GraphDecoder.java:548)
	at jdk.internal.vm.compiler/org.graalvm.compiler.replacements.PEGraphDecoder.decode(PEGraphDecoder.java:833)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.phases.InlineBeforeAnalysis.decodeGraph(InlineBeforeAnalysis.java:98)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:179)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:349)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.createFlowsGraph(MethodTypeFlow.java:93)
	... 13 more

Note: Bringing the configurations in native-image.properties back results in a successful build.

Netty version

Using io.netty:netty-all:4.1.84.Final

JVM version (e.g. java -version)

openjdk 11.0.17 2022-10-18
OpenJDK Runtime Environment GraalVM CE 22.3.0 (build 11.0.17+8-jvmci-22.3-b08)
OpenJDK 64-Bit Server VM GraalVM CE 22.3.0 (build 11.0.17+8-jvmci-22.3-b08, mixed mode, sharing)

OS version (e.g. uname -a)

linux amd64

cc/ @BenWhitehead @suztomo

Issue Analytics

  • State:closed
  • Created 10 months ago
  • Comments:6 (3 by maintainers)

github_iconTop GitHub Comments

1reaction
chrisvestcommented, Dec 6, 2022

Yeah, the metadata we generate is for all of Netty, but you only depend on the parts of Netty you need. You can ignore the warnings, or maybe @linghengqian’s suggestion will silence them.

1reaction
mpeddada1commented, Dec 6, 2022

@gradinac apologies for the delay. Thanks for your detailed explanation! Enabling the metadata repository ended up resulting in a successful build for this reproducer: https://github.com/BenWhitehead/graalvm-netty-slf4j-repro/pull/1.

There is one thing that I wanted to get your thoughts on. While testing, we noticed a lot of warning messages pop up:

Warning: Could not resolve com.barchart.udt.LingerUDT for reflection configuration. Reason: java.lang.ClassNotFoundException: com.barchart.udt.LingerUDT.
Warning: Could not resolve com.github.luben.zstd.ZstdCompressCtx for reflection configuration. Reason: java.lang.ClassNotFoundException: com.github.luben.zstd.ZstdCompressCtx.
Warning: Could not resolve io.netty.handler.ssl.OpenSslClientSessionCache for reflection configuration. Reason: java.lang.NoClassDefFoundError: io/netty/internal/tcnative/SSLSessionCache.
Warning: Could not resolve io.netty.handler.ssl.ReferenceCountedOpenSslClientContext$ExtendedTrustManagerVerifyCallback for reflection configuration. Reason: java.lang.NoClassDefFoundError: io/netty/internal/tcnative/CertificateVerifier.
Warning: Could not resolve io.netty.handler.ssl.ReferenceCountedOpenSslServerContext$ExtendedTrustManagerVerifyCallback for reflection configuration. Reason: java.lang.NoClassDefFoundError: io/netty/internal/tcnative/CertificateVerifier.
Warning: Could not resolve io.netty.handler.ssl.ReferenceCountedOpenSslServerContext$OpenSslServerCertificateCallback for reflection configuration. Reason: java.lang.NoClassDefFoundError: io/netty/internal/tcnative/CertificateCallback.
Warning: Could not resolve org.conscrypt.ConscryptEngine for reflection configuration. Reason: java.lang.ClassNotFoundException: org.conscrypt.ConscryptEngine.
Warning: Could not resolve org.conscrypt.ConscryptEngine for reflection configuration. Reason: java.lang.ClassNotFoundException: org.conscrypt.ConscryptEngine.
Warning: Could not resolve org.conscrypt.ConscryptEngine for reflection configuration. Reason: java.lang.ClassNotFoundException: org.conscrypt.ConscryptEngine.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.encoder.PatternLayoutEncoder for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.encoder.PatternLayoutEncoder.
Warning: Could not resolve ch.qos.logback.classic.pattern.DateConverter for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.pattern.DateConverter.
Warning: Could not resolve ch.qos.logback.classic.pattern.LevelConverter for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.pattern.LevelConverter.
Warning: Could not resolve ch.qos.logback.classic.pattern.LineSeparatorConverter for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.pattern.LineSeparatorConverter.
Warning: Could not resolve ch.qos.logback.classic.pattern.LoggerConverter for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.pattern.LoggerConverter.
Warning: Could not resolve ch.qos.logback.classic.pattern.MessageConverter for reflection configuration. Reason: java.lang.ClassNotFoundException: ch.qos.logback.classic.pattern.MessageConverter.

Have you experienced this before and do you recommend any way to address these?

Read more comments on GitHub >

github_iconTop Results From Across the Web

Error generating native image with Gluonfx for log4j and slf4j ...
I'm trying to build a native image of a JavaFX app with Gluonfx, Micronaut and Graalvm. As logging framework I'm using log4j2 and ......
Read more >
graalvm/native-image - Gitter
I know it is possible to remote debug the native image compilation process but sometimes that ... I'm thinking it might be a...
Read more >
GraalVM native-image build failure using SLF4J and Log4j 2
The native-image command fails trying to initialize org.apache.logging.slf4j.Log4jLogger at build time. Is there a way to use log4j2 with native ...
Read more >
Updates on Class Initialization in GraalVM Native Image ...
The GraalVM native-image tool enables ahead-of-time (AOT) compilation of Java applications into native executables or shared libraries.
Read more >
Fix GraalVM Native Image Build Issues - Simply-How.com
1. Introduction 2. Getting started 3. Build-time errors
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found