JEP 330 and MemoryClassLoader.getResourceAsStream

Jonathan Gibbons jonathan.gibbons at
Wed Aug 22 19:41:04 UTC 2018

Hi Seth,

The provision of getResourceAsStream and getResource was considered in 
the implementation of the Source File Launcher feature ... and was 
dismissed at that time.

* There are no "normal" resources in the (internal) MemoryClassLoader; 
there are only the class files generated from the source file. This 
implies that the provision of these methods in MCL is just for the 
benefit for folk wanting access to the bytyes for a .class file. (I'm 
not that that's bad; I'm just saying that is so.)

* Yes, we could reasonably easily provide getResourceAsStream, but it 
seems weird to provide getResourceAsStream without also providing an 
equivalent getResource, but URLs are not (currently) supported for the 
content of the MemoryClassLoader.  Yes, internally, some "fake" URLs are 
created to keep the API happy, but these are not intended to be used by 
the end-user, and you'll get an error if you try and open a stream from 
the URL.  I would defer to ClassLoader experts as to whether it is 
reasonable to provide getResourceAsStream but not getResource.

It might be reasonable the jdk.compiler module to provide a 
URLStreamHandlerProvider for these URLs; that would require some 

-- Jon

On 08/21/2018 11:07 PM, seth lytle wrote:
> i'm working on adding JEP 330 single-file source invocation support to 
> kilim (an ASM-based continuations library for java for which i'm the 
> primary maintainer). we're prepping to promote my fork to the main 
> site and i'd like to be able to support java 11 single-file source 
> invocation as easily as classpath-based invocation, or at least 
> confirm that the differences are intentional
> - i need access to the bytecode to weave it at runtime
> - MemoryClassLoader doesn't provide getResourceAsStream
> - it does cache the bytecode, so providing this appears to be easy to 
> implement
> - currently, i access it with a javaagent that mimics 
> -
> - getResource is also missing, and again, much of the plumbing appears 
> to be in place
> - i haven't tried manually building the "memory:///" style urls
> an example of my current invocation:
>   cp=$(mvn -q dependency:build-classpath -Dmdep.outputFile=/dev/fd/1)
>   $java11/bin/java -javaagent:${cp/:*} -cp $cp
> what i'd like to be able to do:
> $java11/bin/java -cp $cp
> i saw a previous thread that mentioned getResource in passing but no 
> discussion of whether it was considered (un)desirable. is this feature 
> planned ? are there problems with introducing it ?
> thanks for the great addition to java - using JEP 330 feels fun

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the compiler-dev mailing list