Scanning multi version jars?

Alan Bateman Alan.Bateman at oracle.com
Tue Sep 19 07:34:18 UTC 2017


On 19/09/2017 05:37, Greg Wilkins wrote:
> :
>
> Which raises an interesting point....   with the multi versioned jar I have
> used as an example, which contains:
>
>     - org/example/Foo.class
>     - org/example/Foo$Bar.class
>     - META-INF/versions/9/org/example/Foo.class
>
> What does the classloader do when asked to load "org.example.Foo$Bar" ?
>   If it loads it OK, then the JarFile enumerator/iterator/stream should also
> return it.   If it throws a ClassNotFoundException, then the
> JarFile enumerator/iterator/stream should skip it.
A class loader that loads from a JAR file will just map 
"org.example.Foo$Bar" to entry "org/example/Foo$Bar.class" and attempt 
to define the class bytes to VM.  It shouldn't care if the entry comes 
from the base or a versioned section. It also shouldn't care if the 
class name looks like it might have been compiled from an inner class.

The one case where a custom class loader does need to know more is when 
it loading resources (findResource/findResources implementation 
usually). For that case then the returned URL needs to locate the right 
resource and so may encode a path to a resource in a versioned section. 
You'll see URLClassLoader does the right thing, as does the built-in 
class loaders for cases where you have modular MR JARs on the module 
path. There were a few threads on core-libs-dev discussing whether to 
add a getRealName method but in the end it was kicked down the road to 
re-examine later.

-Alan


More information about the jigsaw-dev mailing list