snowdrop-zen / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
1 stars 0 forks source link

GraalVM 21.0 CE native image for spring-web pulls in AWT classes #269

Closed snowdrop-bot closed 2 years ago

snowdrop-bot commented 3 years ago

Describe the bug Building a native-image for the spring-web integration test with Graal VM 21.0 CE results in AWT classes getting pulled into the native image. This didn't happen with Graal VM 20.3 CE.

Expected behavior No AWT classes, and, thus, native OpenJDK library dependencies should get pulled into the native image.

Actual behavior AWT classes and dependencies get pulled in for a (seemingly) headless example app.

To Reproduce

$ mvn verify -f integration-tests/pom.xml -pl 'spring-web' -Dnative -Dquarkus.native.additional-build-args="-H:+TraceNativeToolUsage" -Dquarkus.native.container-build=true -Dquarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-native-image:21.0-java11
[...]
[quarkus-integration-test-spring-web-1.11.0.Final-runner:24]    (compile): 110,792.65 ms,  6.51 GB
[quarkus-integration-test-spring-web-1.11.0.Final-runner:24]      compile: 171,206.61 ms,  6.51 GB
[quarkus-integration-test-spring-web-1.11.0.Final-runner:24]        image:  17,581.19 ms,  6.52 GB
>> /usr/bin/gcc -z noexecstack -Wl,--gc-sections -Wl,--dynamic-list -Wl,/tmp/SVM-9622854921633199123/exported_symbols.list -Wl,--exclude-libs,ALL -Wl,-x -o /project/quarkus-integration-test-spring-web-1.11.0.Final-runner quarkus-integration-test-spring-web-1.11.0.Final-runner.o /opt/graalvm/lib/static/linux-amd64/glibc/libnet.a /opt/graalvm/lib/static/linux-amd64/glibc/libjavajpeg.a /opt/graalvm/lib/static/linux-amd64/glibc/libextnet.a /opt/graalvm/lib/static/linux-amd64/glibc/libnio.a /opt/graalvm/lib/svm/clibraries/linux-amd64/liblibchelper.a /opt/graalvm/lib/static/linux-amd64/glibc/libjava.a /opt/graalvm/lib/static/linux-amd64/glibc/liblcms.a /opt/graalvm/lib/static/linux-amd64/glibc/libawt_headless.a /opt/graalvm/lib/static/linux-amd64/glibc/libawt.a /opt/graalvm/lib/static/linux-amd64/glibc/libfdlibm.a /opt/graalvm/lib/static/linux-amd64/glibc/libzip.a /opt/graalvm/lib/svm/clibraries/linux-amd64/libjvm.a -v -L/tmp/SVM-9622854921633199123 -L/opt/graalvm/lib/static/linux-amd64/glibc -L/opt/graalvm/lib/svm/clibraries/linux-amd64 -lstdc++ -lm -lpthread -ldl -lz -lrt 
># Using built-in specs.
># COLLECT_GCC=/usr/bin/gcc
># COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/8/lto-wrapper
># OFFLOAD_TARGET_NAMES=nvptx-none
># OFFLOAD_TARGET_DEFAULT=1
># Target: x86_64-redhat-linux
># Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --disable-libmpx --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
># Thread model: posix
># gcc version 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC) 
># COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/8/:/usr/libexec/gcc/x86_64-redhat-linux/8/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/8/:/usr/lib/gcc/x86_64-redhat-linux/
># LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/8/:/usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/8/../../../:/lib/:/usr/lib/
># COLLECT_GCC_OPTIONS='-z' 'noexecstack' '-o' '/project/quarkus-integration-test-spring-web-1.11.0.Final-runner' '-v' '-L/tmp/SVM-9622854921633199123' '-L/opt/graalvm/lib/static/linux-amd64/glibc' '-L/opt/graalvm/lib/svm/clibraries/linux-amd64' '-mtune=generic' '-march=x86-64'
>#  /usr/libexec/gcc/x86_64-redhat-linux/8/collect2 -plugin /usr/libexec/gcc/x86_64-redhat-linux/8/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-redhat-linux/8/lto-wrapper -plugin-opt=-fresolution=/tmp/cclXiM2w.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o /project/quarkus-integration-test-spring-web-1.11.0.Final-runner -z noexecstack /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/8/crtbegin.o -L/tmp/SVM-9622854921633199123 -L/opt/graalvm/lib/static/linux-amd64/glibc -L/opt/graalvm/lib/svm/clibraries/linux-amd64 -L/usr/lib/gcc/x86_64-redhat-linux/8 -L/usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/8/../../.. --gc-sections --dynamic-list /tmp/SVM-9622854921633199123/exported_symbols.list --exclude-libs ALL -x quarkus-integration-test-spring-web-1.11.0.Final-runner.o /opt/graalvm/lib/static/linux-amd64/glibc/libnet.a /opt/graalvm/lib/static/linux-amd64/glibc/libjavajpeg.a /opt/graalvm/lib/static/linux-amd64/glibc/libextnet.a /opt/graalvm/lib/static/linux-amd64/glibc/libnio.a /opt/graalvm/lib/svm/clibraries/linux-amd64/liblibchelper.a /opt/graalvm/lib/static/linux-amd64/glibc/libjava.a /opt/graalvm/lib/static/linux-amd64/glibc/liblcms.a /opt/graalvm/lib/static/linux-amd64/glibc/libawt_headless.a /opt/graalvm/lib/static/linux-amd64/glibc/libawt.a /opt/graalvm/lib/static/linux-amd64/glibc/libfdlibm.a /opt/graalvm/lib/static/linux-amd64/glibc/libzip.a /opt/graalvm/lib/svm/clibraries/linux-amd64/libjvm.a -lstdc++ -lm -lpthread -ldl -lz -lrt -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/8/crtend.o /usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib64/crtn.o
># COLLECT_GCC_OPTIONS='-z' 'noexecstack' '-o' '/project/quarkus-integration-test-spring-web-1.11.0.Final-runner' '-v' '-L/tmp/SVM-9622854921633199123' '-L/opt/graalvm/lib/static/linux-amd64/glibc' '-L/opt/graalvm/lib/svm/clibraries/linux-amd64' '-mtune=generic' '-march=x86-64'
[quarkus-integration-test-spring-web-1.11.0.Final-runner:24]        write:   2,138.46 ms,  6.52 GB
[quarkus-integration-test-spring-web-1.11.0.Final-runner:24]      [total]: 370,673.82 ms,  6.52 GB

Note libawt_headless.a and liblcms.a etc. being added to the link command traced with -H:+TraceNativeToolUsage.

Environment (please complete the following information):

Additional context See my comment about this in the resteasy ImageIO leak fix. Re-posting it here for posterity:

When debugging quarkus-integration-test-spring-web ImageIO class gets loaded via AnalysisMethod com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$10.parse. That turns out to be coming from: lib/org.glassfish.jaxb.jaxb-runtime-2.3.3-b02.jar Once you find where the source code of that actually is we arrive here: https://github.com/eclipse-ee4j/jaxb-ri/blob/2.3.3-b01-RI-RELEASE/jaxb-ri/runtime/impl/src/main/java/com/sun/xml/bind/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java#L48

In an asynchronous discussion it was discovered that ImageIO usages in jaxb are legitimate. However, there should be some way to tell quarkus "this-is-a-headless-app-using-jaxb" and this, in turn, would remove/substitute ImageIO usages in jaxb and therefore not pull in AWT classes and native libs.


https://github.com/quarkusio/quarkus/issues/14972


$upstream:14972$