oracle / graal

GraalVM compiles Java applications into native executables that start instantly, scale fast, and use fewer compute resources 🚀
https://www.graalvm.org
Other
20.34k stars 1.63k forks source link

Graalvm 20.2.0 with Groovy+JDK8 throws runtime NullPointerException/Stream closed exception #2858

Open omar391 opened 4 years ago

omar391 commented 4 years ago

Describe the issue The image was generated using the following environments and option. However, not sure how to reproduce the err from a sample code as it get generated from private codes and this whole native code generation is confusing.

Describe GraalVM and your environment:

Gradle config:

apply plugin: 'com.palantir.graal'
graal {
    graalVersion graalVmVersion
    mainClass javaMainClass
    javaVersion graalJdkLtsVersion
    outputName '...'
    option '--allow-incomplete-classpath'
    option '--report-unsupported-elements-at-runtime'
    option '--enable-https'
    option '--enable-http'
    option '--static'
    option '--no-fallback'
    option '--no-server'
    option '-H:+TraceClassInitialization'
    option '-H:+ReportExceptionStackTraces'
    option "-H:ConfigurationFileDirectories=../$configurationFileDirectories"
}

task generateConfiguration(type: Exec) {
    group = "graal"
    description = "Run application to generate the configuration for native image"
    dependsOn build
    commandLine project.gradle.gradleUserHomeDir.toPath().resolve("caches/com.palantir.graal/$graalVmVersion/$graalJdkLtsVersion/graalvm-ce-java$graalJdkLtsVersion-$graalVmVersion/bin/java"), "-agentlib:native-image-agent=config-output-dir=" + project.buildDir.toPath().resolve("../$configurationFileDirectories"), "-cp", sourceSets.main.runtimeClasspath.getAsPath(), javaMainClass, "-n"

    doFirst {
        mkdir project.buildDir.toPath().resolve("../$configurationFileDirectories")
    }
}

Error details

java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:159)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
    at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:337)
    at java.io.DataInputStream.readUTF(DataInputStream.java:589)
    at java.io.DataInputStream.readUTF(DataInputStream.java:564)
    at org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord.loadDgmInfo(GeneratedMetaMethod.java:194)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.registerMethods(MetaClassRegistryImpl.java:199)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:108)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:86)
    at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:37)
    at com.oracle.svm.core.classinitialization.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:351)
    at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:271)
    at org.codehaus.groovy.reflection.ClassInfo.isValidWeakMetaClass(ClassInfo.java:284)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClassForClass(ClassInfo.java:254)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:310)
    at com.astronlab.commonutils.utils.TimeUtils.$getStaticMetaClass(TimeUtils.groovy)
    at com.astronlab.commonutils.utils.TimeUtils.<init>(TimeUtils.groovy)
    at com.astronlab.commonutils.utils.TimeUtils.newAnalyzer(TimeUtils.groovy:19)
    at com.astronlab.damjachai.DamJachaiRunner.main(DamJachaiRunner.java:35)
Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:291)
    at org.codehaus.groovy.reflection.ClassInfo.isValidWeakMetaClass(ClassInfo.java:284)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClassForClass(ClassInfo.java:254)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:310)
    at com.astronlab.commonutils.utils.TimeUtils.$getStaticMetaClass(TimeUtils.groovy)
    at com.astronlab.commonutils.utils.TimeUtils.<init>(TimeUtils.groovy)
    at com.astronlab.commonutils.utils.TimeUtils.newAnalyzer(TimeUtils.groovy:19)
    at com.astronlab.damjachai.DamJachaiRunner.main(DamJachaiRunner.java:35)
Caused by: java.lang.NullPointerException
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:114)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:86)
    at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:37)
    at com.oracle.svm.core.classinitialization.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:351)
    at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:271)                  
... 7 more
jramirez-isc commented 4 years ago

Hi @omar391 Without a reproducer is hard to tell. But the error seems to be related to class initialization at run-time/build-time. You can get more info about that here: https://github.com/oracle/graal/blob/master/substratevm/ClassInitialization.md

Does the issue occur at build-time or run-time?

omar391 commented 4 years ago

@jramirez-isc , Thanks for replying. This issue happens at runtime. There pops several issues at build time if i don't specify "option '--allow-incomplete-classpath', option '--report-unsupported-elements-at-runtime'" these 2 options. I will see if I can shorten it into a reproducible block. In general, based on my search and readings, it seems, Groovy is not well matched in Graal native image story.

cstancu commented 4 years ago

Judging by the name of the class where the error is thrown from this may be a case of missing reflection meta-data. Did you try using the NativeImage agent?

omar391 commented 4 years ago

@cstancu, Yes. As you could see in the Gradle task:

task generateConfiguration(type: Exec) {
    group = "graal"
    description = "Run application to generate the configuration for native image"
    dependsOn build
    commandLine project.gradle.gradleUserHomeDir.toPath().resolve("caches/com.palantir.graal/$graalVmVersion/$graalJdkLtsVersion/graalvm-ce-java$graalJdkLtsVersion-$graalVmVersion/bin/java"), "-agentlib:native-image-agent=config-output-dir=" + project.buildDir.toPath().resolve("../$configurationFileDirectories"), "-cp", sourceSets.main.runtimeClasspath.getAsPath(), javaMainClass, "-n"

    doFirst {
        mkdir project.buildDir.toPath().resolve("../$configurationFileDirectories")
    }
}

Native image building is too much of a hassle. Now I wonder if it is better to be in Go rather than in Java/Groovy/Kotlin if the native is the end goal.

codeconsole commented 2 years ago

I get a similar exception trying to use Groovy with Graalvm. I created an example app here https://github.com/codeconsole/gs-rest-service/tree/native-groovy I have no issues with a pure java version https://github.com/codeconsole/gs-rest-service/tree/native-java

% sdk current java
Using java version 22.1.0.r11-grl
java.io.IOException: Stream closed
        at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:165)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:252)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:271)
        at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:342)
        at java.io.DataInputStream.readUTF(DataInputStream.java:594)
        at java.io.DataInputStream.readUTF(DataInputStream.java:569)
        at org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord.loadDgmInfo(GeneratedMetaMethod.java:195)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.registerMethods(MetaClassRegistryImpl.java:199)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:108)
        at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:86)
        at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:37)
        at org.codehaus.groovy.reflection.ClassInfo.isValidWeakMetaClass(ClassInfo.java:284)
        at org.codehaus.groovy.reflection.ClassInfo.getMetaClassForClass(ClassInfo.java:254)
        at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:310)
        at com.example.restservice.Greeting.$getStaticMetaClass(Greeting.groovy)
        at com.example.restservice.Greeting.<init>(Greeting.groovy)
        at com.example.restservice.GreetingController.greeting(GreetingController.java:17)

Steps to Reproduce:

git clone https://github.com/codeconsole/gs-rest-service
cd gs-rest-service
git checkout native-groovy
cd complete
 ./gradlew nativeRun

http://localhost:8080/greeting