Package, import and type declarations are allowed now in module-info.java by spec
Alex Buckley
alex.buckley at oracle.com
Fri Feb 26 18:26:03 UTC 2016
On 2/26/2016 8:37 AM, Georgiy Rakov wrote:
> current spec [1] now contains following assertions related to grammar:
>
> A compilation unit (JLS 7.3) may contain a module declaration, in
> which case the filename of the compilation unit is typically
> |module-info.java|.
>
> CompilationUnit:
> [PackageDeclaration] {ImportDeclaration} {TypeDeclaration}
> ModuleDeclaration
>
> These assertions allows to specify any of import, package or type
> declarations in any compilation unit, for instance module-info.java is
> allowed to contain any of the mentioned declarations. However currently
> javac in the latest jigsaw build [2] reports an error on such cases
> provided they are compiled in module mode. For example if we have
> following directory structure:
>
> mod\module-info.java:
> module mod {
> exports pkg;
> }
>
> mod\pkg\module-info.java:
> package pkg;
>
> class C {
> }
>
> then compiling it by following command line with javac from [2]:
>
> javac -modulesourcepath . mod\module-info.java mod\pkg\module-info.java
>
> causes following output:
>
> mod\pkg\module-info.java:1: error: expected 'module'
> package pkg;
> ^
> 1 error
javac is merely choosing to implement the rule at the end of JLS 7.6
that a type declaration (optionally preceded by package/import
declarations) must be provided in a suitably named file.
Perhaps I should say "a variant of the rule" because 7.6 as written
concerns a public type and your example has a package-access type.
Still, bottom line, javac is free to require that a compilation unit
which starts with a package declaration _must not_ be in a file called
foo-bar.java -- the hyphen indicates a name that can't possibly align
with the type declared in the compilation unit.
The error message for mod\pkg\module-info.java could be a bit more
helpful, but that's a quality-of-implementation detail.
Conversely, a compilation unit that contains a module declaration _may_
be in a file called module-info.java, or in a file called foo-bar.java,
or in a file called mod_decl.JAV. The "typically" in [1] is meant to
indicate that the sub-clause on filename is non-normative. This is akin
to how a compilation unit that contains a package-access type
declaration for class C _may_ be in a file D.java.
Alex
More information about the jigsaw-dev
mailing list