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.26k stars 1.62k forks source link

[GR-47045] Class.getClassLoader().getResource seems to return an invalid URL for a folder #6884

Closed jeanbisutti closed 4 months ago

jeanbisutti commented 1 year ago

Describe the issue

Given a folder session-records and the following code:

        URL folderUrl = GraalIssueTest.class.getClassLoader().getResource("session-records/");
        System.out.println("folderUrl = " + folderUrl);
        URI uri = folderUrl.toURI();
        System.out.println("uri = " + uri);
        new File(uri);

With a JVM, the output is:

folderUrl = file:/C:/code/azure-sdk-for-java/sdk/monitor/azure-monitor-spring-native-test/target/test-classes/session-records/
uri = file:/C:/code/azure-sdk-for-java/sdk/monitor/azure-monitor-spring-native-test/target/test-classes/session-records/

With a native executable:

folderUrl = resource:/session-records/
uri = resource:/session-records/
java.lang.IllegalArgumentException: URI scheme is not "file"
       java.base@17.0.7/java.io.File.<init>(File.java:423)
       com.azure.GraalIssueTest.test(GraalIssueTest.java:18)

Describe GraalVM and your environment:

Content of the release file:

IMPLEMENTOR="Oracle Corporation"
JAVA_VERSION="17.0.7"
JAVA_VERSION_DATE="2023-04-18"
LIBC="default"
MODULES="java.base java.logging java.management jdk.internal.vm.ci java.compiler java.instrument jdk.jfr jdk.unsupported org.graalvm.sdk java.datatransfer java.xml java.prefs java.desktop java.transaction.xa java.sql jdk.management org.graalvm.truffle jdk.internal.vm.compiler com.oracle.graal.graal_enterprise com.oracle.svm.extraimage_enterprise java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.jvmstat jdk.attach jdk.charsets jdk.compiler jdk.crypto.ec jdk.crypto.cryptoki jdk.crypto.mscapi jdk.dynalink jdk.internal.ed jdk.editpad jdk.hotspot.agent jdk.httpserver jdk.incubator.foreign jdk.incubator.vector jdk.internal.le jdk.internal.opt jdk.internal.vm.compiler.management jdk.internal.vm.compiler.truffle.jfr jdk.jartool jdk.javadoc jdk.jcmd jdk.management.agent jdk.jconsole jdk.jdeps jdk.jdwp.agent jdk.jdi jdk.jlink jdk.jpackage jdk.jshell jdk.jsobject jdk.jstatd jdk.localedata jdk.management.jfr jdk.naming.dns jdk.naming.rmi jdk.net jdk.nio.mapmode jdk.random jdk.sctp jdk.security.auth jdk.security.jgss jdk.unsupported.desktop jdk.xml.dom jdk.zipfs org.graalvm.extraimage.builder org.graalvm.js.scriptengine org.graalvm.locator org.graalvm.nativeimage.llvm"
OS_ARCH="x86_64"
OS_NAME="Windows"
SOURCE=".:git:8ed58a0062e6 open:git:64e1e8a15e62 labsjdk-builder:6fdba7be9f6310a40fce95618f0a2195d0cbf183 compiler:f9ef31f0c872872f7008ae771540f3020223414c graal-enterprise:4d30240e899ca78e72314883702155c0ffd28030 graal-js:940f9a35184ed498c66f156bd9f7adc99a3cec97 graal-microservices:4d30240e899ca78e72314883702155c0ffd28030 java-benchmarks:f9ef31f0c872872f7008ae771540f3020223414c regex:f9ef31f0c872872f7008ae771540f3020223414c sdk:f9ef31f0c872872f7008ae771540f3020223414c substratevm:f9ef31f0c872872f7008ae771540f3020223414c substratevm-enterprise:4d30240e899ca78e72314883702155c0ffd28030 tools:f9ef31f0c872872f7008ae771540f3020223414c tools-enterprise:4d30240e899ca78e72314883702155c0ffd28030 truffle:f9ef31f0c872872f7008ae771540f3020223414c vm:f9ef31f0c872872f7008ae771540f3020223414c vm-enterprise:4d30240e899ca78e72314883702155c0ffd28030"
GRAALVM_VERSION="23.0.0"
COMMIT_INFO={"compiler": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090907, "commit.rev": "f9ef31f0c872872f7008ae771540f3020223414c"}, "graal-enterprise": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090953, "commit.rev": "4d30240e899ca78e72314883702155c0ffd28030"}, "graal-js": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090643, "commit.rev": "940f9a35184ed498c66f156bd9f7adc99a3cec97"}, "graal-microservices": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090953, "commit.rev": "4d30240e899ca78e72314883702155c0ffd28030"}, "java-benchmarks": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090907, "commit.rev": "f9ef31f0c872872f7008ae771540f3020223414c"}, "regex": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090907, "commit.rev": "f9ef31f0c872872f7008ae771540f3020223414c"}, "sdk": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090907, "commit.rev": "f9ef31f0c872872f7008ae771540f3020223414c"}, "substratevm": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090907, "commit.rev": "f9ef31f0c872872f7008ae771540f3020223414c"}, "substratevm-enterprise": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090953, "commit.rev": "4d30240e899ca78e72314883702155c0ffd28030"}, "tools": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090907, "commit.rev": "f9ef31f0c872872f7008ae771540f3020223414c"}, "tools-enterprise": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090953, "commit.rev": "4d30240e899ca78e72314883702155c0ffd28030"}, "truffle": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090907, "commit.rev": "f9ef31f0c872872f7008ae771540f3020223414c"}, "vm": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090907, "commit.rev": "f9ef31f0c872872f7008ae771540f3020223414c"}, "vm-enterprise": {"commit.committer": "Gilles Duboscq <gilles.m.duboscq@oracle.com>", "commit.committer-ts": 1686090953, "commit.rev": "4d30240e899ca78e72314883702155c0ffd28030"}}
component_catalog="rest://gds.oracle.com/api/20220101/|uln://linux-update.oracle.com/rpc/api/?linux=generic_linux_x86_64_graalvm_jdk17&macos=macos_64_graalvm_jdk17&windows=windows_64_graalvm_jdk17|https://www.graalvm.org/component-catalog/v2/graal-updater-ee-component-catalog-java17.properties"
GDS_PRODUCT_ID="D53FAE8052773FFAE0530F15000AA6C6"

More details

resource-config.json file in META-INF\native-image folder:

{
  "resources": {
    "includes": [
      {
        "pattern": "\\Qsession-records/\\E"
      }
    ]
  }
}
oubidar-Abderrahim commented 1 year ago

Thank you for reporting this, we'll take a look into this shortly.

oubidar-Abderrahim commented 4 months ago

We concluded that the example is only working on Java because of some implementation specific behavior of resource lookup from a classPath entry that is a directory. If you put the class file and the directory resource into a jar file it won't work even on Java. So we won't fix this accidentally working constructed/artificial example