From 764dacb9eed91500a2e3c088bd4c536a0c8b108e Mon Sep 17 00:00:00 2001 From: Michal Karm Babacek Date: Sun, 9 Apr 2023 00:34:27 +0200 Subject: [PATCH] AWT: JNI registrations depend on GraalVM version --- .../main/java/io/quarkus/builder/Json.java | 7 - .../pkg/steps/NativeImageBuildRunner.java | 29 +- .../pkg/steps/NativeImageBuildStep.java | 32 +- .../quarkus/awt/deployment/AwtProcessor.java | 326 ++++++++++-------- 4 files changed, 207 insertions(+), 187 deletions(-) diff --git a/core/builder/src/main/java/io/quarkus/builder/Json.java b/core/builder/src/main/java/io/quarkus/builder/Json.java index 33e61b28bb40f..d6bc9ab46465b 100644 --- a/core/builder/src/main/java/io/quarkus/builder/Json.java +++ b/core/builder/src/main/java/io/quarkus/builder/Json.java @@ -52,7 +52,6 @@ public static JsonArrayBuilder array() { } /** - * * @param ignoreEmptyBuilders * @return the new JSON array builder * @see JsonBuilder#ignoreEmptyBuilders @@ -62,7 +61,6 @@ static JsonArrayBuilder array(boolean ignoreEmptyBuilders) { } /** - * * @return the new JSON object builder, empty builders are not ignored */ public static JsonObjectBuilder object() { @@ -70,7 +68,6 @@ public static JsonObjectBuilder object() { } /** - * * @param ignoreEmptyBuilders * @return the new JSON object builder * @see JsonBuilder#ignoreEmptyBuilders @@ -84,7 +81,6 @@ abstract static class JsonBuilder { protected boolean ignoreEmptyBuilders = false; /** - * * @param ignoreEmptyBuilders If set to true all empty builders added to this builder will be ignored during * {@link #build()} */ @@ -93,13 +89,11 @@ abstract static class JsonBuilder { } /** - * * @return true if there are no elements/properties, false otherwise */ abstract boolean isEmpty(); /** - * * @return a string representation * @throws IOException */ @@ -108,7 +102,6 @@ abstract static class JsonBuilder { abstract void appendTo(Appendable appendable) throws IOException; /** - * * @param value * @return true if the value is null or an empty builder and {@link #ignoreEmptyBuilders} is set to * true, false diff --git a/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildRunner.java b/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildRunner.java index d26a18dd64d75..899cf9c280a01 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildRunner.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildRunner.java @@ -21,21 +21,24 @@ public abstract class NativeImageBuildRunner { private static final Logger log = Logger.getLogger(NativeImageBuildRunner.class); + private static GraalVM.Version graalVMVersion = null; + public GraalVM.Version getGraalVMVersion() { - final GraalVM.Version graalVMVersion; - try { - String[] versionCommand = getGraalVMVersionCommand(Collections.singletonList("--version")); - log.debugf(String.join(" ", versionCommand).replace("$", "\\$")); - Process versionProcess = new ProcessBuilder(versionCommand) - .redirectErrorStream(true) - .start(); - versionProcess.waitFor(); - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(versionProcess.getInputStream(), StandardCharsets.UTF_8))) { - graalVMVersion = GraalVM.Version.of(reader.lines()); + if (graalVMVersion == null) { + try { + final String[] versionCommand = getGraalVMVersionCommand(Collections.singletonList("--version")); + log.debugf(String.join(" ", versionCommand).replace("$", "\\$")); + final Process versionProcess = new ProcessBuilder(versionCommand) + .redirectErrorStream(true) + .start(); + versionProcess.waitFor(); + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(versionProcess.getInputStream(), StandardCharsets.UTF_8))) { + graalVMVersion = GraalVM.Version.of(reader.lines()); + } + } catch (Exception e) { + throw new RuntimeException("Failed to get GraalVM version", e); } - } catch (Exception e) { - throw new RuntimeException("Failed to get GraalVM version", e); } return graalVMVersion; } diff --git a/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildStep.java b/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildStep.java index 486c7b639a07a..8b186ddac9782 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildStep.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildStep.java @@ -275,21 +275,23 @@ public NativeImageBuildItem build(NativeConfig nativeConfig, LocalesBuildTimeCon } } - // See https://github.com/oracle/graal/issues/4921 - try (DirectoryStream sharedLibs = Files.newDirectoryStream(outputDir, "*.{so,dll}")) { - sharedLibs.forEach(src -> { - Path dst = null; - try { - dst = Path.of(outputTargetBuildItem.getOutputDirectory().toAbsolutePath().toString(), - src.getFileName().toString()); - log.debugf("Copying a shared lib from %s to %s.", src, dst); - Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); - } catch (IOException e) { - log.errorf("Could not copy shared lib from %s to %s. Continuing. Error: %s", src, dst, e); - } - }); - } catch (IOException e) { - log.errorf("Could not list files in directory %s. Continuing. Error: %s", outputDir, e); + if (graalVMVersion.compareTo(GraalVM.Version.VERSION_23_0_0) >= 0) { + // See https://github.com/oracle/graal/issues/4921 + try (DirectoryStream sharedLibs = Files.newDirectoryStream(outputDir, "*.{so,dll}")) { + sharedLibs.forEach(src -> { + Path dst = null; + try { + dst = Path.of(outputTargetBuildItem.getOutputDirectory().toAbsolutePath().toString(), + src.getFileName().toString()); + log.debugf("Copying a shared lib from %s to %s.", src, dst); + Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + log.errorf("Could not copy shared lib from %s to %s. Continuing. Error: %s", src, dst, e); + } + }); + } catch (IOException e) { + log.errorf("Could not list files in directory %s. Continuing. Error: %s", outputDir, e); + } } System.setProperty("native.image.path", finalExecutablePath.toAbsolutePath().toString()); diff --git a/extensions/awt/deployment/src/main/java/io/quarkus/awt/deployment/AwtProcessor.java b/extensions/awt/deployment/src/main/java/io/quarkus/awt/deployment/AwtProcessor.java index daa289cdfdc50..b2669e1037090 100644 --- a/extensions/awt/deployment/src/main/java/io/quarkus/awt/deployment/AwtProcessor.java +++ b/extensions/awt/deployment/src/main/java/io/quarkus/awt/deployment/AwtProcessor.java @@ -2,6 +2,8 @@ import static io.quarkus.deployment.builditem.nativeimage.UnsupportedOSBuildItem.Os.WINDOWS; +import java.util.ArrayList; +import java.util.List; import java.util.stream.Stream; import io.quarkus.awt.runtime.graal.DarwinAwtFeature; @@ -18,6 +20,8 @@ import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedPackageBuildItem; import io.quarkus.deployment.builditem.nativeimage.UnsupportedOSBuildItem; +import io.quarkus.deployment.pkg.builditem.NativeImageRunnerBuildItem; +import io.quarkus.deployment.pkg.steps.GraalVM; import io.quarkus.deployment.pkg.steps.NativeBuild; import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild; @@ -57,7 +61,7 @@ void resources( .build()); } - @BuildStep + @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class) ReflectiveClassBuildItem setupReflectionClasses() { return ReflectiveClassBuildItem.builder( "com.sun.imageio.plugins.common.I18N", @@ -66,7 +70,7 @@ ReflectiveClassBuildItem setupReflectionClasses() { "sun.awt.X11GraphicsEnvironment").build(); } - @BuildStep + @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class) ReflectiveClassBuildItem setupReflectionClassesWithMethods() { return ReflectiveClassBuildItem.builder( "javax.imageio.plugins.tiff.BaselineTIFFTagSet", @@ -88,162 +92,180 @@ ReflectiveClassBuildItem setupReflectionClassesWithMethods() { "sun.java2d.loops.SetFillSpansANY").methods().build(); } - @BuildStep - void setupAWTInit(BuildProducer jniClassProducer, - BuildProducer jniMethodProducer, - BuildProducer jniFieldProducer) { - jniMethodProducer.produce(new JniRuntimeAccessMethodBuildItem("java.lang.System", "load", "java.lang.String")); - jniMethodProducer.produce( - new JniRuntimeAccessMethodBuildItem("java.lang.System", "setProperty", "java.lang.String", "java.lang.String")); - - jniMethodProducer.produce(new JniRuntimeAccessMethodBuildItem("sun.awt.SunToolkit", "awtLock")); - jniMethodProducer.produce(new JniRuntimeAccessMethodBuildItem("sun.awt.SunToolkit", "awtLockNotify")); - jniMethodProducer.produce(new JniRuntimeAccessMethodBuildItem("sun.awt.SunToolkit", "awtLockNotifyAll")); - jniMethodProducer.produce(new JniRuntimeAccessMethodBuildItem("sun.awt.SunToolkit", "awtLockWait", "long")); - jniMethodProducer.produce(new JniRuntimeAccessMethodBuildItem("sun.awt.SunToolkit", "awtUnlock")); - - jniFieldProducer.produce(new JniRuntimeAccessFieldBuildItem("sun.awt.SunToolkit", "AWT_LOCK")); - jniFieldProducer.produce(new JniRuntimeAccessFieldBuildItem("sun.awt.SunToolkit", "AWT_LOCK_COND")); + @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class) + void setupAWTInit(BuildProducer jc, + BuildProducer jm, + BuildProducer jf, + NativeImageRunnerBuildItem nativeImageRunnerBuildItem) { + final GraalVM.Version v = nativeImageRunnerBuildItem.getBuildRunner().getGraalVMVersion(); + // Dynamically loading shared objects instead + // of baking in static libs: https://github.com/oracle/graal/issues/4921 + if (v.compareTo(GraalVM.Version.VERSION_23_0_0) >= 0) { + jm.produce(new JniRuntimeAccessMethodBuildItem("java.lang.System", "load", "java.lang.String")); + jm.produce( + new JniRuntimeAccessMethodBuildItem("java.lang.System", "setProperty", "java.lang.String", + "java.lang.String")); + jm.produce(new JniRuntimeAccessMethodBuildItem("sun.awt.SunToolkit", "awtLock")); + jm.produce(new JniRuntimeAccessMethodBuildItem("sun.awt.SunToolkit", "awtLockNotify")); + jm.produce(new JniRuntimeAccessMethodBuildItem("sun.awt.SunToolkit", "awtLockNotifyAll")); + jm.produce(new JniRuntimeAccessMethodBuildItem("sun.awt.SunToolkit", "awtLockWait", "long")); + jm.produce(new JniRuntimeAccessMethodBuildItem("sun.awt.SunToolkit", "awtUnlock")); + jf.produce(new JniRuntimeAccessFieldBuildItem("sun.awt.SunToolkit", "AWT_LOCK")); + jf.produce(new JniRuntimeAccessFieldBuildItem("sun.awt.SunToolkit", "AWT_LOCK_COND")); + jm.produce(new JniRuntimeAccessMethodBuildItem("sun.awt.X11.XErrorHandlerUtil", "init", "long")); + jc.produce(new JniRuntimeAccessBuildItem(false, false, true, "sun.awt.X11.XToolkit")); + jm.produce(new JniRuntimeAccessMethodBuildItem("java.lang.Thread", "yield")); + } + } - jniMethodProducer.produce(new JniRuntimeAccessMethodBuildItem("sun.awt.X11.XErrorHandlerUtil", "init", "long")); + @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class) + JniRuntimeAccessBuildItem setupJava2DClasses(NativeImageRunnerBuildItem nativeImageRunnerBuildItem) { + final GraalVM.Version v = nativeImageRunnerBuildItem.getBuildRunner().getGraalVMVersion(); + final List classes = new ArrayList<>(); + classes.add("com.sun.imageio.plugins.jpeg.JPEGImageReader"); + classes.add("com.sun.imageio.plugins.jpeg.JPEGImageWriter"); + classes.add("java.awt.AlphaComposite"); + classes.add("java.awt.Color"); + classes.add("java.awt.color.CMMException"); + classes.add("java.awt.color.ColorSpace"); + classes.add("java.awt.color.ICC_ColorSpace"); + classes.add("java.awt.color.ICC_Profile"); + classes.add("java.awt.color.ICC_ProfileGray"); + classes.add("java.awt.color.ICC_ProfileRGB"); + classes.add("java.awt.Composite"); + classes.add("java.awt.geom.AffineTransform"); + classes.add("java.awt.geom.GeneralPath"); + classes.add("java.awt.geom.Path2D"); + classes.add("java.awt.geom.Path2D$Float"); + classes.add("java.awt.geom.Point2D$Float"); + classes.add("java.awt.geom.Rectangle2D$Float"); + classes.add("java.awt.image.AffineTransformOp"); + classes.add("java.awt.image.BandedSampleModel"); + classes.add("java.awt.image.BufferedImage"); + classes.add("java.awt.image.ColorModel"); + classes.add("java.awt.image.ComponentColorModel"); + classes.add("java.awt.image.ComponentSampleModel"); + classes.add("java.awt.image.ConvolveOp"); + classes.add("java.awt.image.DirectColorModel"); + classes.add("java.awt.image.IndexColorModel"); + classes.add("java.awt.image.Kernel"); + classes.add("java.awt.image.MultiPixelPackedSampleModel"); + classes.add("java.awt.image.PackedColorModel"); + classes.add("java.awt.image.PixelInterleavedSampleModel"); + classes.add("java.awt.image.Raster"); + classes.add("java.awt.image.SampleModel"); + classes.add("java.awt.image.SinglePixelPackedSampleModel"); + classes.add("java.awt.Rectangle"); + classes.add("java.awt.Transparency"); + classes.add("javax.imageio.IIOException"); + classes.add("javax.imageio.plugins.jpeg.JPEGHuffmanTable"); + classes.add("javax.imageio.plugins.jpeg.JPEGQTable"); + classes.add("sun.awt.image.BufImgSurfaceData"); + classes.add("sun.awt.image.BufImgSurfaceData$ICMColorData"); + classes.add("sun.awt.image.ByteBandedRaster"); + classes.add("sun.awt.image.ByteComponentRaster"); + classes.add("sun.awt.image.ByteInterleavedRaster"); + classes.add("sun.awt.image.BytePackedRaster"); + classes.add("sun.awt.image.DataBufferNative"); + classes.add("sun.awt.image.GifImageDecoder"); + classes.add("sun.awt.image.ImageRepresentation"); + classes.add("sun.awt.image.ImagingLib"); + classes.add("sun.awt.image.IntegerComponentRaster"); + classes.add("sun.awt.image.IntegerInterleavedRaster"); + classes.add("sun.awt.image.ShortBandedRaster"); + classes.add("sun.awt.image.ShortComponentRaster"); + classes.add("sun.awt.image.ShortInterleavedRaster"); + classes.add("sun.awt.image.SunWritableRaster"); + classes.add("sun.awt.image.WritableRasterNative"); + classes.add("sun.awt.SunHints"); + classes.add("sun.font.CharToGlyphMapper"); + classes.add("sun.font.Font2D"); + classes.add("sun.font.FontConfigManager"); + classes.add("sun.font.FontConfigManager$FcCompFont"); + classes.add("sun.font.FontConfigManager$FontConfigFont"); + classes.add("sun.font.FontConfigManager$FontConfigInfo"); + classes.add("sun.font.FontManagerNativeLibrary"); + classes.add("sun.font.FontStrike"); + classes.add("sun.font.FreetypeFontScaler"); + classes.add("sun.font.GlyphLayout"); + classes.add("sun.font.GlyphLayout$EngineRecord"); + classes.add("sun.font.GlyphLayout$GVData"); + classes.add("sun.font.GlyphLayout$LayoutEngine"); + classes.add("sun.font.GlyphLayout$LayoutEngineFactory"); + classes.add("sun.font.GlyphLayout$LayoutEngineKey"); + classes.add("sun.font.GlyphLayout$SDCache"); + classes.add("sun.font.GlyphLayout$SDCache$SDKey"); + classes.add("sun.font.GlyphList"); + classes.add("sun.font.PhysicalStrike"); + classes.add("sun.font.StrikeMetrics"); + classes.add("sun.font.TrueTypeFont"); + classes.add("sun.font.Type1Font"); + classes.add("sun.java2d.cmm.lcms.LCMS"); + classes.add("sun.java2d.cmm.lcms.LCMSImageLayout"); + classes.add("sun.java2d.cmm.lcms.LCMSProfile"); + classes.add("sun.java2d.cmm.lcms.LCMSTransform"); + classes.add("sun.java2d.DefaultDisposerRecord"); + classes.add("sun.java2d.Disposer"); + classes.add("sun.java2d.InvalidPipeException"); + classes.add("sun.java2d.loops.Blit"); + classes.add("sun.java2d.loops.BlitBg"); + classes.add("sun.java2d.loops.CompositeType"); + classes.add("sun.java2d.loops.DrawGlyphList"); + classes.add("sun.java2d.loops.DrawGlyphListAA"); + classes.add("sun.java2d.loops.DrawGlyphListLCD"); + classes.add("sun.java2d.loops.DrawLine"); + classes.add("sun.java2d.loops.DrawParallelogram"); + classes.add("sun.java2d.loops.DrawPath"); + classes.add("sun.java2d.loops.DrawPolygons"); + classes.add("sun.java2d.loops.DrawRect"); + classes.add("sun.java2d.loops.FillParallelogram"); + classes.add("sun.java2d.loops.FillPath"); + classes.add("sun.java2d.loops.FillRect"); + classes.add("sun.java2d.loops.FillSpans"); + classes.add("sun.java2d.loops.GraphicsPrimitive"); + classes.add("sun.java2d.loops.GraphicsPrimitiveMgr"); + classes.add("sun.java2d.loops.MaskBlit"); + classes.add("sun.java2d.loops.MaskFill"); + classes.add("sun.java2d.loops.ScaledBlit"); + classes.add("sun.java2d.loops.SurfaceType"); + classes.add("sun.java2d.loops.TransformHelper"); + classes.add("sun.java2d.loops.XORComposite"); + classes.add("sun.java2d.NullSurfaceData"); + classes.add("sun.java2d.pipe.BufferedMaskBlit"); + classes.add("sun.java2d.pipe.GlyphListPipe"); + classes.add("sun.java2d.pipe.Region"); + classes.add("sun.java2d.pipe.RegionIterator"); + classes.add("sun.java2d.pipe.ShapeSpanIterator"); + classes.add("sun.java2d.pipe.SpanClipRenderer"); + classes.add("sun.java2d.pipe.SpanIterator"); + classes.add("sun.java2d.pipe.ValidatePipe"); + classes.add("sun.java2d.SunGraphics2D"); + classes.add("sun.java2d.SurfaceData"); + classes.add("sun.java2d.xr.XRSurfaceData"); - jniClassProducer.produce(new JniRuntimeAccessBuildItem(false, false, true, "sun.awt.X11.XToolkit")); + // A new way of dynamically loading shared objects instead + // of baking in static libs: https://github.com/oracle/graal/issues/4921 + if (v.compareTo(GraalVM.Version.VERSION_23_0_0) >= 0) { + classes.add("java.awt.GraphicsEnvironment"); + classes.add("sun.awt.X11FontManager"); + classes.add("sun.awt.X11GraphicsConfig"); + classes.add("sun.awt.X11GraphicsDevice"); + classes.add("sun.java2d.SunGraphicsEnvironment"); + } - jniMethodProducer.produce(new JniRuntimeAccessMethodBuildItem("java.lang.Thread", "yield")); - } + // Added for JDK 19+ due to: https://github.com/openjdk/jdk20/commit/9bc023220 calling FontUtilities + if (v.jdkVersionGreaterOrEqualTo(19, 0)) { + classes.add("sun.font.FontUtilities"); + } - @BuildStep - JniRuntimeAccessBuildItem setupJava2DClasses() { - return new JniRuntimeAccessBuildItem(true, true, true, - "com.sun.imageio.plugins.jpeg.JPEGImageReader", - "com.sun.imageio.plugins.jpeg.JPEGImageWriter", - "java.awt.AlphaComposite", - "java.awt.Color", - "java.awt.color.CMMException", - "java.awt.color.ColorSpace", - "java.awt.color.ICC_ColorSpace", - "java.awt.color.ICC_Profile", - "java.awt.color.ICC_ProfileGray", - "java.awt.color.ICC_ProfileRGB", - "java.awt.Composite", - "java.awt.geom.AffineTransform", - "java.awt.geom.GeneralPath", - "java.awt.geom.Path2D", - "java.awt.geom.Path2D$Float", - "java.awt.geom.Point2D$Float", - "java.awt.geom.Rectangle2D$Float", - "java.awt.GraphicsEnvironment", - "java.awt.image.AffineTransformOp", - "java.awt.image.BandedSampleModel", - "java.awt.image.BufferedImage", - "java.awt.image.ColorModel", - "java.awt.image.ComponentColorModel", - "java.awt.image.ComponentSampleModel", - "java.awt.image.ConvolveOp", - "java.awt.image.DirectColorModel", - "java.awt.image.IndexColorModel", - "java.awt.image.Kernel", - "java.awt.image.MultiPixelPackedSampleModel", - "java.awt.image.PackedColorModel", - "java.awt.image.PixelInterleavedSampleModel", - "java.awt.image.Raster", - "java.awt.image.SampleModel", - "java.awt.image.SinglePixelPackedSampleModel", - "java.awt.Rectangle", - "java.awt.Transparency", - "javax.imageio.IIOException", - "javax.imageio.plugins.jpeg.JPEGHuffmanTable", - "javax.imageio.plugins.jpeg.JPEGQTable", - "sun.awt.image.BufImgSurfaceData", - "sun.awt.image.BufImgSurfaceData$ICMColorData", - "sun.awt.image.ByteBandedRaster", - "sun.awt.image.ByteComponentRaster", - "sun.awt.image.ByteInterleavedRaster", - "sun.awt.image.BytePackedRaster", - "sun.awt.image.DataBufferNative", - "sun.awt.image.GifImageDecoder", - "sun.awt.image.ImageRepresentation", - "sun.awt.image.ImagingLib", - "sun.awt.image.IntegerComponentRaster", - "sun.awt.image.IntegerInterleavedRaster", - "sun.awt.image.ShortBandedRaster", - "sun.awt.image.ShortComponentRaster", - "sun.awt.image.ShortInterleavedRaster", - "sun.awt.image.SunWritableRaster", - "sun.awt.image.WritableRasterNative", - "sun.awt.SunHints", - "sun.awt.X11FontManager", - "sun.awt.X11GraphicsConfig", - "sun.awt.X11GraphicsDevice", - "sun.font.CharToGlyphMapper", - "sun.font.Font2D", - "sun.font.FontConfigManager", - "sun.font.FontConfigManager$FcCompFont", - "sun.font.FontConfigManager$FontConfigFont", - "sun.font.FontConfigManager$FontConfigInfo", - "sun.font.FontManagerNativeLibrary", - "sun.font.FontStrike", - "sun.font.FontUtilities", - "sun.font.FreetypeFontScaler", - "sun.font.GlyphLayout", - "sun.font.GlyphLayout$EngineRecord", - "sun.font.GlyphLayout$GVData", - "sun.font.GlyphLayout$LayoutEngine", - "sun.font.GlyphLayout$LayoutEngineFactory", - "sun.font.GlyphLayout$LayoutEngineKey", - "sun.font.GlyphLayout$SDCache", - "sun.font.GlyphLayout$SDCache$SDKey", - "sun.font.GlyphList", - "sun.font.PhysicalStrike", - "sun.font.StrikeMetrics", - "sun.font.TrueTypeFont", - "sun.font.Type1Font", - "sun.java2d.cmm.lcms.LCMS", - "sun.java2d.cmm.lcms.LCMSImageLayout", - "sun.java2d.cmm.lcms.LCMSProfile", - "sun.java2d.cmm.lcms.LCMSTransform", - "sun.java2d.DefaultDisposerRecord", - "sun.java2d.Disposer", - "sun.java2d.InvalidPipeException", - "sun.java2d.loops.Blit", - "sun.java2d.loops.BlitBg", - "sun.java2d.loops.CompositeType", - "sun.java2d.loops.DrawGlyphList", - "sun.java2d.loops.DrawGlyphListAA", - "sun.java2d.loops.DrawGlyphListLCD", - "sun.java2d.loops.DrawLine", - "sun.java2d.loops.DrawParallelogram", - "sun.java2d.loops.DrawPath", - "sun.java2d.loops.DrawPolygons", - "sun.java2d.loops.DrawRect", - "sun.java2d.loops.FillParallelogram", - "sun.java2d.loops.FillPath", - "sun.java2d.loops.FillRect", - "sun.java2d.loops.FillSpans", - "sun.java2d.loops.GraphicsPrimitive", - "sun.java2d.loops.GraphicsPrimitiveMgr", - "sun.java2d.loops.MaskBlit", - "sun.java2d.loops.MaskFill", - "sun.java2d.loops.ScaledBlit", - "sun.java2d.loops.SurfaceType", - "sun.java2d.loops.TransformHelper", - "sun.java2d.loops.XORComposite", - "sun.java2d.NullSurfaceData", - "sun.java2d.pipe.BufferedMaskBlit", - "sun.java2d.pipe.GlyphListPipe", - "sun.java2d.pipe.Region", - "sun.java2d.pipe.RegionIterator", - "sun.java2d.pipe.ShapeSpanIterator", - "sun.java2d.pipe.SpanClipRenderer", - "sun.java2d.pipe.SpanIterator", - "sun.java2d.pipe.ValidatePipe", - "sun.java2d.SunGraphics2D", - "sun.java2d.SunGraphicsEnvironment", - "sun.java2d.SurfaceData", - "sun.java2d.xr.XRSurfaceData"); + return new JniRuntimeAccessBuildItem(true, true, true, classes.toArray(new String[0])); } - @BuildStep + /* + * Moved over here due to: https://github.com/quarkusio/quarkus/pull/32069 + * A better detection and DarwinAwtFeature handling might be in order. + */ + @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class) void runtimeInitializedClasses(BuildProducer runtimeInitilizedPackages) { /* * Note that this initialization is not enough if user wants to deserialize actual images