quarkus: ImageIO AWT Quarkus IT test fails with GraalVM 23.0.0-dev build after AWT change

Describe the bug

The awt integration test io.quarkus.awt.it.ImageDecodersIT.testComplexImages fails like so:

[INFO] Running io.quarkus.awt.it.ImageDecodersIT
Executing "/home/runner/work/mandrel/mandrel/quarkus/integration-tests/awt/target/quarkus-integration-test-awt-999-SNAPSHOT-runner -Dquarkus.http.port=8081 -Dquarkus.http.ssl-port=8444 -Dtest.url=http://localhost:8081 -Dquarkus.log.file.path=/home/runner/work/mandrel/mandrel/quarkus/integration-tests/awt/target/quarkus.log -Dquarkus.log.file.enable=true -Dquarkus.native.native-image-xmx=5g"
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2023-03-03 04:16:16,770 ERROR [io.qua.run.Application] (main) Failed to start application (with profile [prod]): java.lang.UnsatisfiedLinkError: no awt in java.library.path
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk.NativeLibrarySupport.loadLibraryRelative(NativeLibrarySupport.java:136)
	at java.base@20-beta/java.lang.ClassLoader.loadLibrary(ClassLoader.java:50)
	at java.base@20-beta/java.lang.Runtime.loadLibrary0(Runtime.java:880)
	at java.base@20-beta/java.lang.System.loadLibrary(System.java:2051)
	at java.desktop@20-beta/java.awt.Toolkit$2.run(Toolkit.java:1384)
	at java.desktop@20-beta/java.awt.Toolkit$2.run(Toolkit.java:1382)
	at java.base@20-beta/java.security.AccessController.executePrivileged(AccessController.java:171)
	at java.base@20-beta/java.security.AccessController.doPrivileged(AccessController.java:319)
	at java.desktop@20-beta/java.awt.Toolkit.loadLibraries(Toolkit.java:1381)
	at java.desktop@20-beta/java.awt.Toolkit.initStatic(Toolkit.java:1419)
	at java.desktop@20-beta/java.awt.Toolkit.<clinit>(Toolkit.java:1393)
	at java.base@20-beta/java.lang.Class.ensureInitialized(DynamicHub.java:550)
	at java.desktop@20-beta/sun.awt.AppContext$2.run(AppContext.java:273)
	at java.desktop@20-beta/sun.awt.AppContext$2.run(AppContext.java:262)
	at java.base@20-beta/java.security.AccessController.executePrivileged(AccessController.java:171)
	at java.base@20-beta/java.security.AccessController.doPrivileged(AccessController.java:319)
	at java.desktop@20-beta/sun.awt.AppContext.initMainAppContext(AppContext.java:262)
	at java.desktop@20-beta/sun.awt.AppContext$3.run(AppContext.java:315)
	at java.desktop@20-beta/sun.awt.AppContext$3.run(AppContext.java:298)
	at java.base@20-beta/java.security.AccessController.executePrivileged(AccessController.java:171)
	at java.base@20-beta/java.security.AccessController.doPrivileged(AccessController.java:319)
	at java.desktop@20-beta/sun.awt.AppContext.getAppContext(AppContext.java:297)
	at java.desktop@20-beta/javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:123)
	at io.quarkus.awt.it.Application.init(Application.java:54)
	at io.quarkus.awt.it.Application_Bean.doCreate(Unknown Source)
	at io.quarkus.awt.it.Application_Bean.create(Unknown Source)
	at io.quarkus.awt.it.Application_Bean.create(Unknown Source)
	at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:113)
	at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:37)
	at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:34)
	at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
	at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
	at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:34)
	at io.quarkus.arc.impl.ClientProxies.getApplicationScopedDelegate(ClientProxies.java:21)
	at io.quarkus.awt.it.Application_ClientProxy.arc$delegate(Unknown Source)
	at io.quarkus.awt.it.Application_ClientProxy.arc_contextualInstance(Unknown Source)
	at io.quarkus.awt.it.Application_Observer_Synthetic_c3d8ba8d0ca6557d80114d16f47388b320fb6386.notify(Unknown Source)
	at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:344)
	at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:326)
	at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:82)
	at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:142)
	at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:102)
	at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(Unknown Source)
	at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(Unknown Source)
	at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
	at io.quarkus.runtime.Application.start(Application.java:101)
	at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:111)
	at io.quarkus.runtime.Quarkus.run(Quarkus.java:71)
	at io.quarkus.runtime.Quarkus.run(Quarkus.java:44)
	at io.quarkus.runtime.Quarkus.run(Quarkus.java:124)
	at io.quarkus.runner.GeneratedMain.main(Unknown Source)

Failed to launch the application. The application logs can be found at: /home/runner/work/mandrel/mandrel/quarkus/integration-tests/awt/target/quarkus.log
Error:  Tests run: 33, Failures: 0, Errors: 1, Skipped: 32, Time elapsed: 6.176 s <<< FAILURE! - in io.quarkus.awt.it.ImageDecodersIT
Error:  io.quarkus.awt.it.ImageDecodersIT.testComplexImages(String)[1]  Time elapsed: 0.017 s  <<< ERROR!
java.lang.RuntimeException: java.lang.RuntimeException: Unable to successfully launch process '2573'. Exit code is: '1'.
	at io.quarkus.test.junit.QuarkusIntegrationTestExtension.throwBootFailureException(QuarkusIntegrationTestExtension.java:347)

Expected behavior

Test passes.

Actual behavior

Test fails.

How to Reproduce?

Run the awt integration-test with a JDK 20-based GraalVM master build. Eg. from here:

Output of uname -a or ver

No response

Output of java -version

20+36

GraalVM version (if different from Java)

master

Quarkus version or git rev

main

Build tool (ie. output of mvnw --version or gradlew --version)

No response

Additional information

Might be related to https://github.com/oracle/graal/pull/6088 that got merged recently.

About this issue

  • Original URL
  • State: closed
  • Created a year ago
  • Comments: 28 (26 by maintainers)

Most upvoted comments

Could not allocate library name over here https://github.com/openjdk/jdk17u-dev/blob/jdk-17.0.7+5/src/java.desktop/unix/native/libawt/awt/awt_LoadLibrary.c#L174

is a false alarm. There is nothing wrong with jstring jbuf = JNU_NewStringPlatform(env, buf); call above.

The error state originates way earlier, over here: https://github.com/openjdk/jdk17u-dev/blob/jdk-17.0.7+5/src/java.desktop/unix/native/libawt/awt/awt_LoadLibrary.c#L62

And is not cleared. I’ll open a PR to enhance that part with a call to CHECK_EXCEPTION_FATAL as it would have saved me considerable time if it were there.

Adding

{
"name":"java.awt.GraphicsEnvironment",
"methods":[{"name":"isHeadless","parameterTypes":[]}]
}

to the JNI Config then solves this particular part.