本文主要解析一下java9 module相關選項html
在classpath的全部jar(無論是否模塊化)共同組成一個unnamed moduleunnamed modules會聲明依賴全部的named module,且exports本身的全部包,可是一個named module不能聲明依賴unnamed module。若是一個package在named和unnamed模塊中都有定義,則使用named中的package。java
默認--illegal-access=permit,即容許unnamed modules反射(java.lang.reflect/java.lang.invoke)使用全部named modules中的類
這個選項主要是爲了方便遷移到java9而設計的,不過在java10可能會移除掉sql
有module-info.java的模塊,是java9正規的module
沒有module-info.java的jar包,若是放在module-path下,java9模塊系統自動將其變成automatic module(其中若是jar包中MANIFEST.MF文件有Automatic-Module-Name屬性,取其值做爲模塊名,沒有的話,將jar包文件名根據必定規則提取模塊名,若是提取不成功則沒法轉變爲automatic module
)
automatic modulemacos
包含main方法的module,經過--module指定
模塊系統解析的根模塊,從根模塊解析(
在編譯時期,而不是運行時
)模塊依賴,能夠經過--add-modules mod1,mod2來將除JDK默認root modules外的模塊添加到模塊依賴解析中,能夠經過掃描模塊描述符把相關依賴的模塊也同時解析了。
JDK9默認的root module是java.se模塊bootstrap
java -d java.se java.se@9 requires java.sql transitive requires java.scripting transitive requires java.logging transitive requires java.security.jgss transitive requires java.management transitive requires java.instrument transitive requires java.naming transitive requires java.xml transitive requires java.compiler transitive requires java.desktop transitive requires java.sql.rowset transitive requires java.management.rmi transitive requires java.base mandated requires java.rmi transitive requires java.xml.crypto transitive requires java.datatransfer transitive requires java.prefs transitive requires java.security.sasl transitive
因爲java.se.ee不在默認的root modules中,所以--add-modules的最多見的用途是用來添加ee中的模塊,好比javv.xml.bind
java -d java.se.ee java.se.ee@9 requires java.xml.bind transitive requires java.base mandated requires java.corba transitive requires java.activation transitive requires java.transaction transitive requires java.xml.ws transitive requires java.se transitive requires java.xml.ws.annotation transitive
layer之於module,就至關於classloader之於class,layer是module的一個加載和實例化的機制。一般用來在運行時動態加載modules
boot layer是java模塊系統首先使用的layer。它包括了bootstrap loader,platform loader,application loader。java runtime會根據--add-modules指定的root modules來構建模塊依賴圖,這一層就是boot layer。api
--module指定包含main方法的module
--add-modules添加module到root set中,方便解析模塊依賴
- ALL-DEFAULT,添加unnamed modules的默認root module添加到root set - ALL-SYSTEM,添加系統模塊(java,jdk,javafx等開頭的模塊,即jdk自身帶的模塊)到root set - ALL-MODULE,添加module-path上全部可讀的module到root set
module-path能夠分爲三類oracle
--module-path將沒有模塊聲明的jar變爲automatic module;module-path能夠是class/jar目錄,jar,jmod目錄
用來在將目錄或jar包中的class文件添加/覆蓋到指定module,一般在測試環節使用
java --path-module targetModuleName=jarDir/replace.jar --module-path moduleDir -m com.example.module/com.example.module.Main
把replace.jar中的class添加或覆蓋到targetModule中
用於縮小模塊範圍,好比
java --limit-modules java.se.ee --list-modules java.activation@9 java.base@9 java.compiler@9 java.corba@9 java.datatransfer@9 java.desktop@9 java.instrument@9 java.logging@9 java.management@9 java.management.rmi@9 java.naming@9 java.prefs@9 java.rmi@9 java.scripting@9 java.se@9 java.se.ee@9 java.security.jgss@9 java.security.sasl@9 java.sql@9 java.sql.rowset@9 java.transaction@9 java.xml@9 java.xml.bind@9 java.xml.crypto@9 java.xml.ws@9 java.xml.ws.annotation@9 jdk.httpserver@9 jdk.unsupported@9
用來限定編譯及運行時可使用的模塊,限定的範圍是main module,--add-modules添加的modules,以及該參數指定的modules及其transitive依賴的modules
當包含main方法的module是unnamed modules的時候,常常用這個參數來減小須要被解析的模塊數量。
編譯時+運行時
)配合javac使用的時候就是容許編譯時能夠訪問
javac -d outputDir --add-exports java.base/sun.net=com.example --module-source-path src $(find . -name "*.java")
配合java使用的時候就是容許運行時能夠訪問
java --module-path outputDir --add-exports java.base/sun.net=com.example -m com.example/com.example.Main
用來建立、查看jmod文件
cd $JAVA_HOME ➜ Home ./bin/jmod list ./jmods/java.logging.jmod classes/module-info.class classes/java/util/logging/ConsoleHandler.class classes/java/util/logging/ErrorManager.class classes/java/util/logging/FileHandler$1.class classes/java/util/logging/FileHandler$InitializationErrorManager.class classes/java/util/logging/FileHandler$MeteredStream.class classes/java/util/logging/FileHandler.class classes/java/util/logging/Filter.class classes/java/util/logging/Formatter.class classes/java/util/logging/Handler$1.class classes/java/util/logging/Handler.class classes/java/util/logging/Level$1.class classes/java/util/logging/Level$KnownLevel.class classes/java/util/logging/Level$RbAccess.class classes/java/util/logging/Level.class classes/java/util/logging/Logger$1.class classes/java/util/logging/Logger$ConfigurationData.class classes/java/util/logging/Logger$LoggerBundle.class classes/java/util/logging/Logger$RbAccess.class classes/java/util/logging/Logger$SystemLoggerHelper$1.class classes/java/util/logging/Logger$SystemLoggerHelper.class classes/java/util/logging/Logger.class classes/java/util/logging/Logging.class classes/java/util/logging/LoggingMXBean.class classes/java/util/logging/LoggingPermission.class classes/java/util/logging/LogManager$1.class classes/java/util/logging/LogManager$2.class classes/java/util/logging/LogManager$3.class classes/java/util/logging/LogManager$4.class classes/java/util/logging/LogManager$5.class classes/java/util/logging/LogManager$6.class classes/java/util/logging/LogManager$7.class classes/java/util/logging/LogManager$Cleaner.class classes/java/util/logging/LogManager$CloseOnReset.class classes/java/util/logging/LogManager$ConfigProperty.class classes/java/util/logging/LogManager$LoggerContext$1.class classes/java/util/logging/LogManager$LoggerContext.class classes/java/util/logging/LogManager$LoggerWeakRef.class classes/java/util/logging/LogManager$LoggingProviderAccess.class classes/java/util/logging/LogManager$LogNode.class classes/java/util/logging/LogManager$ModType.class classes/java/util/logging/LogManager$RootLogger.class classes/java/util/logging/LogManager$SystemLoggerContext.class classes/java/util/logging/LogManager$VisitedLoggers.class classes/java/util/logging/LogManager.class classes/java/util/logging/LogRecord$CallerFinder.class classes/java/util/logging/LogRecord.class classes/java/util/logging/MemoryHandler.class classes/java/util/logging/SimpleFormatter.class classes/java/util/logging/SocketHandler.class classes/java/util/logging/StreamHandler$1.class classes/java/util/logging/StreamHandler.class classes/java/util/logging/XMLFormatter.class classes/sun/net/www/protocol/http/logging/HttpLogFormatter.class classes/sun/util/logging/internal/LoggingProviderImpl$JULWrapper.class classes/sun/util/logging/internal/LoggingProviderImpl$LogManagerAccess.class classes/sun/util/logging/internal/LoggingProviderImpl.class classes/sun/util/logging/resources/logging.class classes/sun/util/logging/resources/logging_de.class classes/sun/util/logging/resources/logging_es.class classes/sun/util/logging/resources/logging_fr.class classes/sun/util/logging/resources/logging_it.class classes/sun/util/logging/resources/logging_ja.class classes/sun/util/logging/resources/logging_ko.class classes/sun/util/logging/resources/logging_pt_BR.class classes/sun/util/logging/resources/logging_sv.class classes/sun/util/logging/resources/logging_zh_CN.class classes/sun/util/logging/resources/logging_zh_HK.class classes/sun/util/logging/resources/logging_zh_TW.class conf/logging.properties legal/COPYRIGHT legal/LICENSE ➜ Home ./bin/jmod describe ./jmods/java.logging.jmod java.logging@9 exports java.util.logging requires java.base mandated provides jdk.internal.logger.DefaultLoggerFinder with sun.util.logging.internal.loggingproviderimpl contains sun.net.www.protocol.http.logging contains sun.util.logging.internal contains sun.util.logging.resources platform macos-amd64
弄清楚modules的分類及其相關選項,能夠有助於咱們更好地使用java9的模塊系統。app