Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 776
TK. Avatar asked Dec 18 '17 10:12

TK.


2 Answers

You can use open module to open all packages (internal or not) to all modules. I don't think there's any intermediate granularity.

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

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

(copied from Alexey Romanov's comment)

like image 164
ruediste Avatar answered Oct 20 '22 00:10

ruediste


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.

like image 37
M A Avatar answered Oct 20 '22 01:10

M A