摘要:命令行參數文件鑒于遷移到后可能需要很長的命令行參數,有些會限制命令行長度,支持定義一個命令行參數文件。已有三分庫可以自動轉成模塊,只要在啟動時將放在指定路徑中,便會自動變成。
java[c]命令行參數文件
鑒于遷移到java9后可能需要很長的命令行參數,有些os會限制命令行長度,java9支持定義一個命令行參數文件。使用方式:
java @arguments.txt
arguments.txt內容(每個選項一行):
-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
前面我們說過以前很多時候我們或第三方庫使用jdk不推薦使用的內部類,比如sun.,jdk.internal.,在jdk9之后這些類被強封裝了,為了保持兼容性,默認運行運行時訪問,其行為可以通過java選項--illegal-access=值,控制,默認值為permit,其他可選值有warn,debug,deny
除此之外還有些類被移除了,比如sun.misc.Base64Decoder/Base64Encoder, 不過提供了替代方案java.util.Encoder
我們可以借助于jdeps工具來發現這些問題,使用方式:
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
比如分析上面的這個模塊:
jdeps -recursive -summary -cp lib/*.jar out
-recusive代表requires transitive的也會被分析,-summary代表匯總依賴信息,不然會打印很長的依賴信息, -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,故而我們在遷移到模塊時應將jackson-databind作為Automic Module,故而遷移到模塊化后的代碼結構如下:
.
├── lib
│ ├── jackson-annotations-2.8.8.jar
│ └── jackson-core-2.8.8.jar
├── mods
│ └── jackson-databind-2.8.8.jar //這里會被作為Automic Module
└── src
└── books ├── demo │ ├── Book.java │ └── Main.java └── module-info.java
module-info.java內容:
module books { requires jackson.databind; opens demo; }
使用jdeps分析 module-based依賴:
jdeps -module-path out:mods -m books
注意:使用jdeps我們還可以利用-dotoutput選項來輸出模塊的依賴關系圖作為文件保存
除了分析依賴之外,jdeps還可以生成module-info.java,這在遷移已有三方庫的時候特別有用:
jdeps --generate-module-info ./out mylibrary.jarJAXB與其他JavaEE API
java.se.ee模塊
除了之前說的unamed modules,還有一種叫automatic modules,這是為解決已有三方庫遷移到模塊化的問題。已有三分庫可以自動轉成模塊,只要在啟動時將jar放在指定--module-path路徑中,便會自動變成automatic module。
automatic module的特性:1、該module本身是open的;2、該module的依賴由開發者自行解決,編譯時無法找出相關問題;3、automatic module與explicit module的區別在于,前者可以無限制訪問unamed module,而后者遵循模塊的封裝性原則。
automatic modules模塊名: 比如jackson-databind-2.8.8.jar,在java定義它成模塊時,首先需要掃描MATA-INF/MANIFEST.MF中的Automatic-Module-Name字段,如果沒有這個字段,那么就以jar文件名字作為模塊名,比如jackson-databind-2.8.8.jar的模塊名就是jackson.databind,轉成模塊名時會把-替換成. 然后版本號會被忽略掉。
未遷移代碼就不列出來了,遷移后的代碼結構如下:
. ├── 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內容
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內容
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
我們還可以將自己的應用拆分為多個模塊
演化圖如下:
遷移方式一,遷移為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,然后進行簡單修改
jdeps --generate-module-info ./out mylibrary.jar //你也可以使用--generate-open-module選項
方式三,遷移為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
針對不同版本發布 javac --release 版本號 比如 javac --release 8
模塊化開發工具 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執行模塊
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}
具體執行命令 mvn exec:exec
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71471.html
摘要:新特性概述系列一安裝及使用系列二運行系列三模塊系統精要系列四更新系列五系列六系列七系列八系列九與的區別遷移注意事項參數遷移相關選項解析使用構建實例使用示例帶你提前了解中的新特性 Java語言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性...
摘要:但是模塊化當中,無法掃描只有模塊中可以使用有兩種解決方案定義一個專門的資源模塊,并使用提供的接口,實現它,并將這個實現注冊為服務。有兩種方式使用或包名,包名模塊名使用運行時動態。 模塊設計的原則: 1、防止出現編譯時循環依賴(主要是編譯器不支持),但運行時是允許循環依賴的,比如GUI應用2、明確模塊的邊界 幾種模塊設計: API模塊,聚合模塊(比如java.base) 可選依賴 兩種方...
摘要:如果你想查看運行時模塊的加載過程輸出結果表示為模塊,由于我限制了不再往下輸出了,而我們模塊又沒有別的額外依賴,所以僅有這行輸出。 jdk9模塊快速入門 列出自帶模塊:java --list-modulesmac多版本jdk共存:http://adolphor.com/blog/2016...模塊規則示意圖:showImg(https://segmentfault.com/img/bVb...
摘要:序本文主要研究一下參數的遷移。比如實例為,為,文件數為,每個文件,文件名為,為和輸出實例遷移舊版相關參數遷移舊版運行時參數遷移小結把的配置統一到了中,可以按照官方給出的新舊參數映射表進行遷移。 序 本文主要研究一下java9 gc log參數的遷移。 統一JVM及GC的Logging java9引進了一個統一的日志框架,對gc log的輸出進行了統一的配置。 相關JEP(JDK Enh...
摘要:什么是項目是第一個官方的的縮寫,即交互式編程環境,是一種命令行工具。它允許你無需編寫類或者方法來執行語句。它與的解釋器或其它本地支持的語言,如和類似。在即將到來的的特性中,這絕對是更有趣的特性之一。 什么是JShell? JShell/Kulla項目是第一個官方的Java REPL (Read-Eval-Print-Loop的縮寫,即交互式編程環境),是一種命令行工具。它允許你無需編寫...
閱讀 1172·2021-11-24 09:39
閱讀 2675·2021-09-28 09:35
閱讀 1070·2019-08-30 15:55
閱讀 1361·2019-08-30 15:44
閱讀 880·2019-08-29 17:00
閱讀 1969·2019-08-29 12:19
閱讀 3311·2019-08-28 18:28
閱讀 690·2019-08-28 18:10