Issue with qualified exports

Alex Buckley alex.buckley at oracle.com
Wed Jul 20 23:37:34 UTC 2016


Since A does not require B, you are quite right that the compiler 
doesn't need B to compile A per se. It's solely the qualified export to 
B that drives the compiler to demand B when compiling A's module 
declaration. (I believe that javac should be disinterested in B when 
compiling A's type declarations.)

By all means, raise an issue on jpms-spec-comments about how a qualified 
export induces a compile-time circularity, being sure to note that 
taking a more relaxed view means passing through garbage qualified exports.

Alex

On 7/20/2016 4:22 PM, Paul Benedict wrote:
> Alex, I must respectfully disagree with your analogy. We both agree that
> it is good for the compiler to check an "import" statement. I imagine we
> would also both agree that checking "requires" is good too. I would
> argue what makes this good is because the developer has the intention of
> locating and consuming a resource -- package or module, respectively.
> Even with a wildcard import statement, I am explicitly asking to consume
> the contents of a package (whatever the contents); so if the package
> isn't there, my intention cannot be met.
>
> However, in my scenario here, I have no need to consume. Module A is not
> consuming anything from Module B. All I want to do is issue a directive
> for Module B at runtime, if B is even available at runtime. So I don't
> really think the analogy you gave me applies.
>
> Now, I could write a stub project for B and install it somewhere, but
> that is kind of silly, don't you think? Why make me go through these
> hoops? The compiler isn't providing any value here with this check. The
> compiler doesn't need B to be statically accessible to prove anything
> about exporting a package, does it? If it does, can you let me know why
> it needs this proof?
>
> Cheers,
> Paul
>
> On Wed, Jul 20, 2016 at 6:00 PM, Alex Buckley <alex.buckley at oracle.com
> <mailto:alex.buckley at oracle.com>> wrote:
>
>     On 7/20/2016 3:07 PM, Paul Benedict wrote:
>
>         Currently I am writing a module that another team will consume.
>         Let's just
>         call these modules A and B. Module A must export its packages to
>         Module B
>         and B alone.
>
>         For reasons beyond my control, I do not have access to Module B.
>         However, I
>         don't need to consume any types from B or use B in anyway --
>         just need to
>         give package visibility to B. So the compiler is stopping me
>         because it
>         says "error: module not found". Yes, the compiler is right...
>         but it's too
>         right.
>
>         What do you think of loosening the compiler restriction here? I
>         don't see a
>         reason why the export target must be known at this point.
>
>
>     We start by supposing that compile-time checking is good. Think of
>     how the compiler checks your 'import' declarations in ordinary .java
>     files. Even if you do a wildcard import because you're not sure
>     which types you'll use, you still have the compiler checking that
>     the package exists. For qualified exports, we assume that if you're
>     friendly enough with the owner of B to add a qualified export to B,
>     then you're friendly enough to have a copy of B available. As such,
>     if you write 'exports ... to V' (yes, V, not B), then we aim to
>     check that V exists. It doesn't, so you'll get an error, and you'll
>     smack yourself for typing V rather than B.
>
>     A wrinkle in your scenario is that module B requires module A, so B
>     must be compiled with A present. And, A must be compiled with B
>     present, due to 'exports ... to B'. There's no circularity in the
>     'requires' clauses, but there is effectively a circularity in the
>     module declarations more broadly. A certain amount of incremental
>     craftsmanship will be necessary to allow this pair of modules to flower.
>
>
>
>


More information about the jigsaw-dev mailing list