Fwd: resource location problem in JDK 9 from build 148 onward
David Holmes
david.holmes at oracle.com
Tue Jan 17 01:15:36 UTC 2017
Hi Rick,
<dropping derby-dev from cc list>
On 17/01/2017 10:55 AM, Rick Hillegas wrote:
> Resending since the moderator rejected my initial post for want of a
> subscription to jigsaw-dev.
>
> -------- Original Message --------
> Subject: resource location problem in JDK 9 from build 148 onward
> Date: Mon, 16 Jan 2017 08:45:23 -0800
> From: Rick Hillegas <rick.hillegas at gmail.com>
> To: jigsaw-dev at openjdk.java.net, "derby-dev at db.apache.org"
> <derby-dev at db.apache.org>
>
>
>
> Dalibor Topic suggested that I pose this question to the jigsaw-dev list:
>
> Starting (at least) with build 148, resource location has changed in a
> way which is not backward compatible with JDK 8. The following
> experiment shows the behavior change:
>
> 1) Compile the following class using JDK 8 and put it in a jar file
> called z.jar:
>
> public class public class ResourceLocationProblem
> {
> public static void main(String... args) throws Exception
> {
> String resourceName = "/META-INF/MANIFEST.MF";
> Class dummyClass = (new Object()).getClass();
> Object is = dummyClass.getResourceAsStream(resourceName);
>
> if (is != null) { System.out.println("Resource found."); }
> else { System.out.println("Resource NOT found!"); }
> }
> }
>
> 2) Then run the program thusly:
>
> java -cp z.jar ResourceLocationProblem
>
> On JDK 8, the program produces this output...
>
> Resource found.
>
> ...while on JDK 9 build 151 the program produces this output...
>
> Resource NOT found!
>
> Dalibor pointed me to the following proposal, which indicates that some
> significant changes have been made to resource location:
> http://mail.openjdk.java.net/pipermail/jpms-spec-experts/2016-September/000392.html
>
> However, I am not trying to use any jigsaw features. This test program
> suggests that JDK 9 will break many legacy applications.
>
> 1) Is the observed behavior change a bug?
No. Modules enforce strong encapsulation of types and resources. As per
the link you were given:
- The `Class::getResource*` methods, when invoked upon a class defined
in a named module, only locate resources from within that module.
These methods are also caller-sensitive.
So you are using Object.class is the named java.base module to try and
find local resources in the unnamed-module, that are in z.jar. That
won't work.
> 2) What is the recommended workaround?
Use a Class object from the "module" that contains the resource i.e.
ResourceAllocationProblem.class in your example.
David
-----
> Thanks,
> -Rick
>
More information about the jigsaw-dev
mailing list