Search code examples
javaspringjava-9module-info

Can a module-info.java 'opens' statement include a package and all sub-packages?


I have a module-info.java file that looks like -

module foo.microservice {
    requires spring.core;
    requires spring.beans;
    requires spring.context;
    requires java.sql; // required for Spring Annotation based configuration :(

    opens foo.microservice.configuration to spring.core;
    opens foo.microservice.internal.services to spring.beans;
    opens foo.microservice.internal.controllers to spring.beans;

    exports foo.microservice.configuration;
    exports foo.microservice.controllers;
    exports foo.microservice.models;
    exports foo.microservice.services;
}

I'm hoping that it might be possible to allow Spring to access all internal packages without explicitly adding each one to the module-info.java.

Is there a way to have a more generic opens statement to allow all my internal packages (and sub-packages) to be accessible to spring.beans?


Solution

  • Currently no, as the JLS defines a module declaration as a list of directives where each directive has the below syntax:

    ModuleDirective:
         requires {RequiresModifier} ModuleName ;
         exports PackageName [to ModuleName {, ModuleName}] ;
         opens PackageName [to ModuleName {, ModuleName}] ;
         uses TypeName ;
         provides TypeName with TypeName {, TypeName} ; 
    

    The same syntax applies for both exports and opens: no wildcards are allowed in the package name. Maybe that could be improved in the future, but I think it would be a bad practice, similar to the bad practice of using such wildcards in import statements.