摘要:命令行參數(shù)文件鑒于遷移到后可能需要很長(zhǎng)的命令行參數(shù),有些會(huì)限制命令行長(zhǎng)度,支持定義一個(gè)命令行參數(shù)文件。已有三分庫可以自動(dòng)轉(zhuǎn)成模塊,只要在啟動(dòng)時(shí)將放在指定路徑中,便會(huì)自動(dòng)變成。
java[c]命令行參數(shù)文件
鑒于遷移到j(luò)ava9后可能需要很長(zhǎng)的命令行參數(shù),有些os會(huì)限制命令行長(zhǎng)度,java9支持定義一個(gè)命令行參數(shù)文件。使用方式:
java @arguments.txt
arguments.txt內(nèi)容(每個(gè)選項(xiàng)一行):
-cp application.jar:javassist.jar --add-opens java.base/java.lang=ALL_UNNAMED --add-exports java.base/sun.security.x509=ALL_UNNAMED -jar application.jarJdeps
前面我們說過以前很多時(shí)候我們或第三方庫使用jdk不推薦使用的內(nèi)部類,比如sun.,jdk.internal.,在jdk9之后這些類被強(qiáng)封裝了,為了保持兼容性,默認(rèn)運(yùn)行運(yùn)行時(shí)訪問,其行為可以通過java選項(xiàng)--illegal-access=值,控制,默認(rèn)值為permit,其他可選值有warn,debug,deny
除此之外還有些類被移除了,比如sun.misc.Base64Decoder/Base64Encoder, 不過提供了替代方案java.util.Encoder
我們可以借助于jdeps工具來發(fā)現(xiàn)這些問題,使用方式:
jdeps -jdkinternals Xxx.class
注意:jdeps只能用于分析class文件或jar,不能用于分析源碼文件
使用jdeps分析 classpath-based依賴:
.
├── jars
│ ├── jackson-annotations-2.8.8.jar
│ └── jackson-core-2.8.8.jar
| └── jackson-databind-2.8.8.1.jar
└── out
├── demo ├── Book.class └── Main.class
比如分析上面的這個(gè)模塊:
jdeps -recursive -summary -cp lib/*.jar out
-recusive代表requires transitive的也會(huì)被分析,-summary代表匯總依賴信息,不然會(huì)打印很長(zhǎng)的依賴信息, -cp classpath, out就是需要被分析的class/jar文件路徑
tjw$ jdeps -recursive -summary -cp lib/*.jar out jackson-annotations-2.8.8.jar -> java.base jackson-core-2.8.8.jar -> java.base jackson-databind-2.8.8.jar -> lib/jackson-annotations-2.8.8.jar jackson-databind-2.8.8.jar -> lib/jackson-core-2.8.8.jar jackson-databind-2.8.8.jar -> java.base jackson-databind-2.8.8.jar -> java.desktop jackson-databind-2.8.8.jar -> java.logging jackson-databind-2.8.8.jar -> java.sql jackson-databind-2.8.8.jar -> java.xml out -> lib/jackson-databind-2.8.8.jar out -> java.base
上面的依賴分析顯示,我們的代碼直接依賴jackson-databind,故而我們?cè)谶w移到模塊時(shí)應(yīng)將jackson-databind作為Automic Module,故而遷移到模塊化后的代碼結(jié)構(gòu)如下:
.
├── lib
│ ├── jackson-annotations-2.8.8.jar
│ └── jackson-core-2.8.8.jar
├── mods
│ └── jackson-databind-2.8.8.jar //這里會(huì)被作為Automic Module
└── src
└── books ├── demo │ ├── Book.java │ └── Main.java └── module-info.java
module-info.java內(nèi)容:
module books { requires jackson.databind; opens demo; }
使用jdeps分析 module-based依賴:
jdeps -module-path out:mods -m books
注意:使用jdeps我們還可以利用-dotoutput選項(xiàng)來輸出模塊的依賴關(guān)系圖作為文件保存
除了分析依賴之外,jdeps還可以生成module-info.java,這在遷移已有三方庫的時(shí)候特別有用:
jdeps --generate-module-info ./out mylibrary.jarJAXB與其他JavaEE API
java.se.ee模塊
除了之前說的unamed modules,還有一種叫automatic modules,這是為解決已有三方庫遷移到模塊化的問題。已有三分庫可以自動(dòng)轉(zhuǎn)成模塊,只要在啟動(dòng)時(shí)將jar放在指定--module-path路徑中,便會(huì)自動(dòng)變成automatic module。
automatic module的特性:1、該module本身是open的;2、該module的依賴由開發(fā)者自行解決,編譯時(shí)無法找出相關(guān)問題;3、automatic module與explicit module的區(qū)別在于,前者可以無限制訪問unamed module,而后者遵循模塊的封裝性原則。
automatic modules模塊名: 比如jackson-databind-2.8.8.jar,在java定義它成模塊時(shí),首先需要掃描MATA-INF/MANIFEST.MF中的Automatic-Module-Name字段,如果沒有這個(gè)字段,那么就以jar文件名字作為模塊名,比如jackson-databind-2.8.8.jar的模塊名就是jackson.databind,轉(zhuǎn)成模塊名時(shí)會(huì)把-替換成. 然后版本號(hào)會(huì)被忽略掉。
未遷移代碼就不列出來了,遷移后的代碼結(jié)構(gòu)如下:
. ├── README.md ├── lib │ ├── hsqldb-2.3.4.jar │ ├── ... │ ├── slf4j-api-1.7.21.jar │ ├── slf4j-simple-1.7.21.jar │ ├── spring-aop-4.3.2.RELEASE.jar │ ├── spring-beans-4.3.2.RELEASE.jar │ ├── spring-core-4.3.2.RELEASE.jar │ ├── spring-expression-4.3.2.RELEASE.jar │ ├── spring-jdbc-4.3.2.RELEASE.jar │ └── spring-orm-4.3.2.RELEASE.jar ├── mods │ ├── hibernate-core-5.2.2.Final.jar │ ├── hibernate-jpa-2.1-api-1.0.0.Final.jar │ ├── javassist-3.20.0-GA.jar │ ├── javax.inject-1.jar │ ├── spring-context-4.3.2.RELEASE.jar │ └── spring-tx-4.3.2.RELEASE.jar ├── run.sh └── src └── bookapp ├── books │ ├── api │ │ ├── entities │ │ │ └── Book.java │ │ └── service │ │ └── BooksService.java │ └── impl │ ├── entities │ │ └── BookEntity.java │ └── service │ └── HibernateBooksService.java ├── bookstore │ ├── api │ │ └── service │ │ └── BookstoreService.java │ └── impl │ └── service │ └── BookstoreServiceImpl.java ├── log4j2.xml ├── main │ └── Main.java ├── main.xml └── module-info.java
module-info.java內(nèi)容
module bookapp { requires spring.context; requires spring.tx; requires javax.inject; requires hibernate.core; requires hibernate.jpa; exports books.api.entities; exports books.api.service; opens books.impl.entities; opens books.impl.service; exports bookstore.api.service; opens bookstore.impl.service; }
run.sh內(nèi)容
CP=lib/antlr-2.7.7.jar: ... CP+=lib/slf4j-api-1.7.21.jar: CP+=lib/slf4j-simple-1.7.21.jar: CP+=lib/spring-aop-4.3.2.RELEASE.jar: CP+=lib/spring-beans-4.3.2.RELEASE.jar: CP+=lib/spring-core-4.3.2.RELEASE.jar: CP+=lib/spring-expression-4.3.2.RELEASE.jar: CP+=lib/spring-jdbc-4.3.2.RELEASE.jar: CP+=lib/spring-orm-4.3.2.RELEASE.jar $JAVA_HOME/bin/javac -cp $CP --module-path mods --add-modules java.naming -d out --module-source-path src -m bookapp cp $(find src -name "*.xml") out/bookapp $JAVA_HOME/bin/java -cp $CP --module-path mods:out --add-modules java.xml.bind,java.sql --add-opens java.base/java.lang=javassist -m bookapp/main.Main
我們還可以將自己的應(yīng)用拆分為多個(gè)模塊
演化圖如下:
遷移方式一,遷移為Automatic Module,適用于沒有源碼的情形:
模塊名:在MANIFEST.MF中定義
Automatic-Module-Name: com.javamodularity.modulename
jar -cfm mylibrary.jar META-INF/MANIFEST.MF -C out/ .
你也可以使用maven插件
org.apache.maven.plugins maven-jar-plugin com.mymodule
遷移方式二,遷移為explicit module,適用于庫的作者或者有源碼的情形:
首先借助jdeps生成module-info.java,然后進(jìn)行簡(jiǎn)單修改
jdeps --generate-module-info ./out mylibrary.jar //你也可以使用--generate-open-module選項(xiàng)
方式三,遷移為explicit module,即使沒有源碼:
mkdir mylibrary cd mylibrary jar -xf ../mylibrary.jar cd .. javac -d mylibrary out/mylibrary/module-info.java jar -uf mylibrary.jar -C mylibrary module-info.class
針對(duì)不同版本發(fā)布 javac --release 版本號(hào) 比如 javac --release 8
模塊化開發(fā)工具 maven. ├── README.md ├── algorithm.api │ ├── pom.xml │ └── src │ └── main │ └── java │ ├── javamodularity │ │ └── easytext │ │ └── algorithm │ │ └── api │ │ ├── Analyzer.java │ │ ├── Preprocessing.java │ │ └── SyllableCounter.java │ └── module-info.java ├── cli │ ├── README.adoc │ ├── pom.xml │ └── src │ └── main │ ├── java │ │ ├── javamodularity │ │ │ └── easytext │ │ │ └── cli │ │ │ └── Main.java │ │ └── module-info.java │ └── resources │ └── test.txt ├── gui │ ├── gui.iml │ ├── pom.xml │ └── src │ └── main │ └── java │ ├── javamodularity │ │ └── easytext │ │ └── gui │ │ └── Main.java │ └── module-info.java ├── pom.xml └── run.sh
org.apache.maven.plugins maven-compiler-plugin 3.6.1 9
使用maven執(zhí)行模塊
org.codehaus.mojo exec-maven-plugin 1.6.0 exec ${JAVA_HOME}/bin/java --module-path --module easytext.cli/javamodularity.easytext.cli.Main ${easytext.file}
具體執(zhí)行命令 mvn exec:exec
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71471.html
摘要:新特性概述系列一安裝及使用系列二運(yùn)行系列三模塊系統(tǒng)精要系列四更新系列五系列六系列七系列八系列九與的區(qū)別遷移注意事項(xiàng)參數(shù)遷移相關(guān)選項(xiàng)解析使用構(gòu)建實(shí)例使用示例帶你提前了解中的新特性 Java語言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性...
摘要:但是模塊化當(dāng)中,無法掃描只有模塊中可以使用有兩種解決方案定義一個(gè)專門的資源模塊,并使用提供的接口,實(shí)現(xiàn)它,并將這個(gè)實(shí)現(xiàn)注冊(cè)為服務(wù)。有兩種方式使用或包名,包名模塊名使用運(yùn)行時(shí)動(dòng)態(tài)。 模塊設(shè)計(jì)的原則: 1、防止出現(xiàn)編譯時(shí)循環(huán)依賴(主要是編譯器不支持),但運(yùn)行時(shí)是允許循環(huán)依賴的,比如GUI應(yīng)用2、明確模塊的邊界 幾種模塊設(shè)計(jì): API模塊,聚合模塊(比如java.base) 可選依賴 兩種方...
摘要:如果你想查看運(yùn)行時(shí)模塊的加載過程輸出結(jié)果表示為模塊,由于我限制了不再往下輸出了,而我們模塊又沒有別的額外依賴,所以僅有這行輸出。 jdk9模塊快速入門 列出自帶模塊:java --list-modulesmac多版本jdk共存:http://adolphor.com/blog/2016...模塊規(guī)則示意圖:showImg(https://segmentfault.com/img/bVb...
摘要:序本文主要研究一下參數(shù)的遷移。比如實(shí)例為,為,文件數(shù)為,每個(gè)文件,文件名為,為和輸出實(shí)例遷移舊版相關(guān)參數(shù)遷移舊版運(yùn)行時(shí)參數(shù)遷移小結(jié)把的配置統(tǒng)一到了中,可以按照官方給出的新舊參數(shù)映射表進(jìn)行遷移。 序 本文主要研究一下java9 gc log參數(shù)的遷移。 統(tǒng)一JVM及GC的Logging java9引進(jìn)了一個(gè)統(tǒng)一的日志框架,對(duì)gc log的輸出進(jìn)行了統(tǒng)一的配置。 相關(guān)JEP(JDK Enh...
摘要:什么是項(xiàng)目是第一個(gè)官方的的縮寫,即交互式編程環(huán)境,是一種命令行工具。它允許你無需編寫類或者方法來執(zhí)行語句。它與的解釋器或其它本地支持的語言,如和類似。在即將到來的的特性中,這絕對(duì)是更有趣的特性之一。 什么是JShell? JShell/Kulla項(xiàng)目是第一個(gè)官方的Java REPL (Read-Eval-Print-Loop的縮寫,即交互式編程環(huán)境),是一種命令行工具。它允許你無需編寫...
閱讀 1183·2021-11-24 09:39
閱讀 2688·2021-09-28 09:35
閱讀 1082·2019-08-30 15:55
閱讀 1376·2019-08-30 15:44
閱讀 886·2019-08-29 17:00
閱讀 1983·2019-08-29 12:19
閱讀 3320·2019-08-28 18:28
閱讀 701·2019-08-28 18:10