java9 module相關選項解析

本文主要解析一下java9 module相關選項html

module分類

unnamed module

在classpath的全部jar(無論是否模塊化)共同組成一個unnamed modulejava

unnamed modules會聲明依賴全部的named module,且exports本身的全部包,可是一個named module不能聲明依賴unnamed module。若是一個package在named和unnamed模塊中都有定義,則使用named中的package。sql

默認--illegal-access=permit,即容許unnamed modules反射(java.lang.reflect/java.lang.invoke)使用全部named modules中的類 這個選項主要是爲了方便遷移到java9而設計的,不過在java10可能會移除掉macos

named module

有module-info.java的模塊,是java9正規的module 沒有module-info.java的jar包,若是放在module-path下,java9模塊系統自動將其變成automatic module(其中若是jar包中MANIFEST.MF文件有Automatic-Module-Name屬性,取其值做爲模塊名,沒有的話,將jar包文件名根據必定規則提取模塊名,若是提取不成功則沒法轉變爲automatic module)bootstrap

automatic moduleapi

  • 默認導出/open本身全部的package
  • transitive依賴jdk,其餘automatic module及本身的module等其餘全部存在的模塊
  • 能夠訪問classpath那些unnamed module的類
  • jlink不支持連接automatic modules

main module

包含main方法的module,經過--module指定bash

root module

模塊系統解析的根模塊,從根模塊解析(在編譯時期,而不是運行時)模塊依賴,能夠經過--add-modules mod1,mod2來將除JDK默認root modules外的模塊添加到模塊依賴解析中,能夠經過掃描模塊描述符把相關依賴的模塊也同時解析了。oracle

JDK9默認的root module是java.se模塊app

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.bindide

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
複製代碼

layers

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。

相關選項

--module

--module指定包含main方法的module

--add-modules

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

module-path能夠分爲三類

  • application module path,經過--module-path指定
  • compilation module path,經過--module-source-path指定,配合javac使用
  • upgrade module path,經過--upgrade-module-path指定

--module-path將沒有模塊聲明的jar變爲automatic module;module-path能夠是class/jar目錄,jar,jmod目錄

--path-module

用來在將目錄或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中

--limit-modules

用於縮小模塊範圍,好比

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的時候,常常用這個參數來減小須要被解析的模塊數量。

--add-exports(編譯時+運行時)

配合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

用來建立、查看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的模塊系統。

doc

相關文章
相關標籤/搜索