Scanning multi version jars?
Alan Bateman
Alan.Bateman at oracle.com
Thu Sep 14 09:07:47 UTC 2017
On 13/09/2017 23:12, Greg Wilkins wrote:
> I hope this is the right group for this question. please redirect me if not.
Probably core-libs-dev as this isn't anything to do with modules but in
any case ...
>
> The Jetty project is trying to implement annotation scanning for multi
> version jars and have some concerns with some edge cases, specifically with
> inner classes.
>
> A multi versioned jar might contain something like:
>
> - org/example/Foo.class
> - org/example/Foo$Bar.class
> - META-INF/versions/9/org/example/Foo.class
>
> It is clear that there is a java 9 version of Foo. But what is unclear is
> the inner class Foo$Bar? Is that only used by the base Foo version? or
> does the java 9 version also use the Foo$Bar inner class, but it didn't use
> any java 9 features, so the base version is able to be used??
>
> It is unclear from just an index of the jar if we should be
> scanning Foo$Bar for annotations. So currently it appears that we have to
> actually scan the Foo class to see if Foo$Bar is referenced and only then
> scan Foo$Bar for annotations (and recursive analysis for any Foo$Bar$Bob
> class )!
Is Foo$Bar public and part of org.example's API? If so then I would
expect compiling the 9 version of Foo.java will generate a class file
for each of the inner classes and so the scenario shouldn't arise. If
Foo$Bar is not public (and so not part of org.example's API), and you
scanning non-public classes, then it would need special handling and
examination of the InnerClasses attribute in both classes. I wouldn't
expect it will arise too often to cause a performance issue (assuming
that is the concern).
>
> PS. The JarFile.getEntry method does not appear to respect it's javadoc
> with respect to multiversioned jars: it says it will do a search for the
> most recent version, however the code indicates that the search is only
> done if the base version does not exist. This is kind of separate issue,
> but makes it difficult to defer the behaviour of what to scan to the
> implementation in JarFile
getEntry/getJarEntry will return a JarEntry if it is present in the base
section or a versioned section (<= max version you specified when
opening the JarFile) or both. I agree the javadoc is a bit confusing and
could be improved but I assume you don't actually have an issue here as
the JarEntry returned will locate the entry in the versioned section if
it exists.
-Alan
More information about the jigsaw-dev
mailing list