2017-12-18 221 views
4

我有一個module-info.java文件看起來像 -module-info.java'open'語句是否可以包含一個包和所有的子包?

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; 
} 

我希望,有可能允許Spring來訪問所有內部包而不明確地將每一個到module-info.java。

有沒有辦法讓更通用的opens聲明允許我所有的內部包(和子包)可以被spring.beans訪問?

+0

「出口」和「打開」在module-info.java中具有非常不同的功能,所以我沒有看到這些問題是重複的。 –

+3

您可以使用'open module'打開所有模塊的所有軟件包(內部或不是)。我不認爲有任何中間粒度。 –

+1

@nullpointer Nicolai的回答解釋了爲什麼不允許「出口」,並指出這個原因不適用於'opens'。所以不,我不認爲它回答了爲什麼不允許「打開」。 –

回答

4

目前國內還沒有,因爲JLS defines a module declaration作爲指令的列表,其中每個指令有以下語法:

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

同樣的語法都同時適用於exportsopens:沒有允許使用通配符的包名。也許這可能會在未來得到改善,但我認爲這將是一種不好的做法,類似於在進口報表中使用這種通配符的不良做法。

+2

加上一個用於JLS鏈接的相同。 – nullpointer

+2

答案是正確的,但我想補充一點,這不必被視爲不幸。恰恰相反,我認爲應始終明確故意導出/打開軟件包。此外,這將促進具有相同前綴的誤解包在某種程度上是相關的,但它們不是。 – Nicolai

相關問題