FlowingCode / GridExporterAddon

Other
10 stars 8 forks source link

Provide reflection hints for native compilation #110

Closed javier-godoy closed 1 month ago

javier-godoy commented 3 months ago

Add-on require some reflection hints for native compilation. It also requires -H:+AddAllCharsets

java.nio.charset.UnsupportedCharsetException: CP1252
        at java.base@22/java.nio.charset.Charset.forName(Charset.java:559) ~[native-image.exe:na]
        at org.apache.poi.util.LocaleUtil.<clinit>(LocaleUtil.java:56) ~[na:na]
        at org.apache.poi.poifs.filesystem.FileMagic.<init>(FileMagic.java:133) ~[native-image.exe:5.2.3]
        at org.apache.poi.poifs.filesystem.FileMagic.<clinit>(FileMagic.java:74) ~[native-image.exe:5.2.3]
        at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:214) ~[na:na]
        at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:185) ~[na:na]
        at com.flowingcode.vaadin.addons.gridexporter.ExcelInputStreamFactory.getBaseTemplateWorkbook(ExcelInputStreamFactory.java:423) ~[na:na]
javier-godoy commented 2 months ago
  1. Add resource-config.json, reflect-config.json and ForeignRegistrationFeature.java

  2. Run apt-get update && apt-get install -y fontconfig libfreetype6 fonts-dejavu

  3. Compile with -H:+ForeignAPISupport -H:+AddAllCharsets --features=com.flowingcode.ForeignRegistrationFeature

  4. Run the application with -Djava.home=something (as a workaround for https://mail.openjdk.org/pipermail/client-libs-dev/2022-December/009431.html)

However, it keeps failing with the following error, with seems to be a limitation of the native image:

    com.oracle.svm.core.jdk.UnsupportedFeatureError: Defining hidden classes at runtime is not supported.
    at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:121) ~[na:na]
    at java.base@22.0.1/java.lang.ClassLoader.defineClass0(ClassLoader.java:323) ~[native-image:na]
    at java.base@22.0.1/java.lang.System$2.defineClass(System.java:2402) ~[na:na]
    at java.base@22.0.1/java.lang.invoke.MethodHandles$Lookup$ClassDefiner.defineClass(MethodHandles.java:2492) ~[na:na]
    at java.base@22.0.1/java.lang.invoke.MethodHandles$Lookup$ClassDefiner.defineClassAsLookup(MethodHandles.java:2471) ~[na:na]
    at java.base@22.0.1/java.lang.invoke.MethodHandles$Lookup.defineHiddenClass(MethodHandles.java:2137) ~[native-image:na]
    at java.base@22.0.1/jdk.internal.foreign.abi.BindingSpecializer.specializeUpcall(BindingSpecializer.java:184) ~[na:na]
    at java.base@22.0.1/jdk.internal.foreign.abi.UpcallLinker.makeFactory(UpcallLinker.java:75) ~[na:na]
    at java.base@22.0.1/jdk.internal.foreign.abi.SharedUtils.arrangeUpcallHelper(SharedUtils.java:198) ~[na:na]
    at java.base@22.0.1/jdk.internal.foreign.abi.x64.sysv.CallArranger.arrangeUpcall(CallArranger.java:147) ~[na:na]
    at java.base@22.0.1/jdk.internal.foreign.abi.x64.sysv.SysVx64Linker.arrangeUpcall(SysVx64Linker.java:67) ~[native-image:na]
    at java.base@22.0.1/jdk.internal.foreign.abi.AbstractLinker.lambda$upcallStub$1(AbstractLinker.java:133) ~[native-image:na]
    at java.base@22.0.1/jdk.internal.foreign.abi.SoftReferenceCache$Node.get(SoftReferenceCache.java:49) ~[na:na]
    at java.base@22.0.1/jdk.internal.foreign.abi.SoftReferenceCache.get(SoftReferenceCache.java:38) ~[na:na]
    at java.base@22.0.1/jdk.internal.foreign.abi.AbstractLinker.upcallStub(AbstractLinker.java:132) ~[native-image:na]
    at java.desktop@22.0.1/sun.font.HBShaper.<clinit>(HBShaper.java:218) ~[native-image:na]
    at java.desktop@22.0.1/sun.font.SunLayoutEngine.layout(SunLayoutEngine.java:185) ~[na:na]
    at java.desktop@22.0.1/sun.font.GlyphLayout$EngineRecord.layout(GlyphLayout.java:669) ~[na:na]
    at java.desktop@22.0.1/sun.font.GlyphLayout.layout(GlyphLayout.java:459) ~[na:na]
    at java.desktop@22.0.1/sun.font.ExtendedTextSourceLabel.createGV(ExtendedTextSourceLabel.java:333) ~[na:na]
    at java.desktop@22.0.1/sun.font.ExtendedTextSourceLabel.getGV(ExtendedTextSourceLabel.java:319) ~[na:na]
    at java.desktop@22.0.1/sun.font.ExtendedTextSourceLabel.createLogicalBounds(ExtendedTextSourceLabel.java:229) ~[na:na]
    at java.desktop@22.0.1/sun.font.ExtendedTextSourceLabel.getAdvance(ExtendedTextSourceLabel.java:138) ~[na:na]
    at java.desktop@22.0.1/java.awt.font.TextLine.init(TextLine.java:281) ~[na:na]
    at java.desktop@22.0.1/java.awt.font.TextLine.<init>(TextLine.java:129) ~[na:na]
    at java.desktop@22.0.1/java.awt.font.TextLine.fastCreateTextLine(TextLine.java:978) ~[na:na]
    at java.desktop@22.0.1/java.awt.font.TextLayout.fastInit(TextLayout.java:611) ~[na:na]
    at java.desktop@22.0.1/java.awt.font.TextLayout.<init>(TextLayout.java:532) ~[na:na]
    at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:301) ~[na:na]
    at org.apache.poi.ss.util.SheetUtil.getColumnWidth(SheetUtil.java:273) ~[na:na]
    at org.apache.poi.ss.util.SheetUtil.getColumnWidth(SheetUtil.java:257) ~[na:na]
    at org.apache.poi.xssf.usermodel.XSSFSheet.autoSizeColumn(XSSFSheet.java:497) ~[native-image:5.2.3]
    at org.apache.poi.xssf.usermodel.XSSFSheet.autoSizeColumn(XSSFSheet.java:479) ~[native-image:5.2.3]

(For avoidance of doubt, the code in this comment is licensed under the same license and attribution as the add-on)

mlopezFC commented 2 months ago

Maybe this is related with the autosizing feature, we could disable it for the demos.