no error when module exports non-existing package

Alex Buckley alex.buckley at
Tue Dec 8 02:35:48 UTC 2015

On 12/2/2015 2:29 PM, Jonathan Gibbons wrote:
> On 12/02/2015 02:20 PM, Victor Rudometov wrote:
>> On 02.12.2015 21:09, Jonathan Gibbons wrote:
>>> On 12/02/2015 10:08 AM, Jonathan Gibbons wrote:
>>>> On 12/02/2015 09:41 AM, Victor Rudometov wrote:
>>>>> Hi,
>>>>> Javac does not complain if user exports a package that does not
>>>>> exist. If it was not done intentionally, it would be good to report
>>>>> an error, or at least a warning.
>>>>> Today was the third time I saw the code with a typo or just
>>>>> incorrect package name in module-info's exports statement.
>>>>> Thanks.
>>>>> Victor.
>>>> I agree we should improve javac in this area. We probably need some
>>>> spec clarification from Alex on the intent here. See JLS 8, 7.4.3
>>>> Observability of a package.  In particular, that says that a package
>>>> is observable if a subpackage is observable. javac tries to honor
>>>> that specification, but there are well known hard-to-fix bugs in
>>>> this area.
>>>> As for module declarations,   if  p.q.Class exists in a module and
>>>> no other classes anywhere in p or its subpackages, is it OK to
>>>> export p from the module?  From the point of view of the module, the
>>>> package is observable, but it seems intuitively wrong to allow an
>>>> export of a package that contains no types. In other words, if we
>>>> are going to catch typos in exported package names, I think we ought
>>>> to consider "empty" packages as well as mistyped packages.
>>>> -- Jon
>> I agree with you, it is worth to consider disallowing "empty" packages
>> together with mistyped ones.
>> While I do not see the use for mistyped non-existing packages there
>> are cases when "empty" might be useful. F.e., is the case of p.q.Class
>> and p.r.OtherClass it would be easier to export just p, rather than
>> both p.q and p.r. However I'd prefer to write explicit p.q and p.r.
>> Victor
> exports should never include subpackages, so "exports p;" could only
> ever mean "exports public types in package p" which raises the
> additional question, what if package p is not empty, but has no public
> types to be exported.
> -- Jon

We disallow mistyped module names in 'requires' clauses, so I think we 
should disallow mistyped package names and empty packages for 'exports'. 
That is, the package must be observable in the current module and must 
contain at least observable compilation unit, or a compile-time error 

This means that typo avoidance is a language feature, not a javac 
feature, in contrast to the lint warnings for "missing 'requires 
public'" which are pure javac.


More information about the jigsaw-dev mailing list