On 15/09/2017 13:14, Alexander Udalov wrote:
It looks like exporting a package from a (non-open) module with an
"exports" directive is not enough to ensure that
Module.getResourceAsStream on that module would load resources from
the module. Surprisingly, adding an "opens" directive for the same
package to the module declaration allows resources to be found.

I've put up a simple project to demonstrate this issue:
https://github.com/udalov/jigsaw-resources-are-not-exported

I'm wondering whether this is a bug or expected behavior?
Yes, this is expected behavior. The javadoc has all details. In your example, if kotlin.reflect is using Class.getResourceXXX or Module.getResourceAsStream to locate a non .class resource in module X then module X needs to open the package with the resource to at least kotlin.reflect.


I would
expect that exporting a package would also open it not only for uses
of reflection, but for resource loading. I can't find anything related
to resources in the JLS, but p.7.7 "Module Declarations" gives a clear
impression that the "exports" directive gives a superset of
functionality of the "opens" directive in this regard.
I think you need to re-read JLS 7.7.2. As `opens` doesn't grant any access at compile-time then you think of it as being a subset of `exports` in this phase.  On the other hand, `opens` grants access to the public classes/members and additionally reflective access to all members of all classes at run-time so you can think of it as a superset in this phase. The resource APIs just build on this.

-Alan

Reply via email to