真棒:使用Java 11實現應用的模組化
Java 11帶來成熟的模組化系統,OSGI丟一邊去吧,為什麼要遷移到模組系統?
1. 模組能帶來可靠的配置 - 新的模組系統是需要在程式元件裡明確宣告依賴的方法,這種替代料以前預設的但是脆弱的、容易出錯的類路徑機制,好像只要把Jar包放入classpath就大功告成了,其實沒有那麼容易,版本衝突等等非常煩人。
2.強封裝 - 允許元件宣告哪些公共型別可供外部其他元件訪問,哪些不可被訪問。
3.為你的應用程式建立最小的JRE映像。
4.減少應用程式記憶體佔用量。
5.最佳化應用程式啟動時間。
以 Spring PetClinic為案例:
git clone git@github.com:spring-projects/spring-petclinic.git
看看具體怎麼實現模組化:
1. 在src / main / java目錄中建立一個名為module-info.java的檔案,其中包含以下內容:
現在,嘗試編譯應用程式時,您會看到很多錯誤,而在以前java 8中則不會出現。這意味著應用程式表現為模組化佈局,並且必須混入模組功能進行了編譯和執行。
可以使用Maven依賴項外掛解析目標列出當前在類路徑中的所有模組名稱,並將它們新增到module-info中:
填入module-info以後變成下面:
open關鍵詞是用於Spring和Hibernate的反射機制.
2.使用maven-jar-plugin建立應用程式jar(僅限於類)並將其複製到modules目錄:
3.使用maven-dependency-plugin複製執行時的依賴到modules目錄:
spring-boot-devtools 應該從模組中排除
4.升級 java.persistence 和 java.transaction版本:
在spring-boot-starter-data-jpa中排除對舊javax.transaction的依賴項:
5.修改maven-surefire-plugin配置以禁用分叉程式:
當存在module-info.java並且啟用了fork程式時,surefire會建立一個包含模組和未命名模組的混合類路徑,從而導致模組可見性問題並阻止應用程式啟動。
6.打包並測試應用程式。
./mvnw clean package
7.使用Java模組系統執行應用程式:
由於Spring和Hibernate依賴項需要JDK反射訪問,因此需要--add -opens。
8.如果使用以下命令設定模組main-class屬性,則可以刪除使用module引數指定的主類:
9.為了自動執行上一步,您可以新增exec-maven-plugin:
10.現在您可以不需要自己宣告主類的情況下執行應用程式:
1. 模組能帶來可靠的配置 - 新的模組系統是需要在程式元件裡明確宣告依賴的方法,這種替代料以前預設的但是脆弱的、容易出錯的類路徑機制,好像只要把Jar包放入classpath就大功告成了,其實沒有那麼容易,版本衝突等等非常煩人。
2.強封裝 - 允許元件宣告哪些公共型別可供外部其他元件訪問,哪些不可被訪問。
3.為你的應用程式建立最小的JRE映像。
4.減少應用程式記憶體佔用量。
5.最佳化應用程式啟動時間。
以 Spring PetClinic為案例:
git clone git@github.com:spring-projects/spring-petclinic.git
看看具體怎麼實現模組化:
1. 在src / main / java目錄中建立一個名為module-info.java的檔案,其中包含以下內容:
module spring.petclinic { } <p class="indent"> |
現在,嘗試編譯應用程式時,您會看到很多錯誤,而在以前java 8中則不會出現。這意味著應用程式表現為模組化佈局,並且必須混入模組功能進行了編譯和執行。
可以使用Maven依賴項外掛解析目標列出當前在類路徑中的所有模組名稱,並將它們新增到module-info中:
./mvnw compile org.apache.maven.plugins:maven-dependency-plugin:3.1.1:resolve <p class="indent"> |
填入module-info以後變成下面:
open module spring.petclinic { requires cache.api; requires java.activation; requires java.instrument; requires java.persistence; requires java.sql; requires java.transaction; requires java.validation; requires java.xml.bind; requires org.hibernate.validator; requires spring.beans; requires spring.boot; requires spring.boot.autoconfigure; requires spring.context; requires spring.core; requires spring.data.commons; requires spring.data.jpa; requires spring.tx; requires spring.web; requires spring.webmvc; requires jdk.unsupported; } <p class="indent"> |
open關鍵詞是用於Spring和Hibernate的反射機制.
2.使用maven-jar-plugin建立應用程式jar(僅限於類)並將其複製到modules目錄:
<plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> <configuration> <outputDirectory> ${project.build.directory}/modules </outputDirectory> </configuration> </plugin> <p class="indent"> |
3.使用maven-dependency-plugin複製執行時的依賴到modules目錄:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory> ${project.build.directory}/modules </outputDirectory> <includeScope>runtime</includeScope> <excludeArtifactIds> spring-boot-devtools </excludeArtifactIds> </configuration> </execution> </executions> </plugin> <p class="indent"> |
spring-boot-devtools 應該從模組中排除
4.升級 java.persistence 和 java.transaction版本:
<dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.2.Final</version> </dependency> <dependency> <groupId>org.jboss.spec.javax.transaction</groupId> <artifactId>jboss-transaction-api_1.2_spec</artifactId> <version>1.1.1.Final</version> </dependency> |
在spring-boot-starter-data-jpa中排除對舊javax.transaction的依賴項:
<exclusions> <exclusion> <artifactId>javax.transaction-api</artifactId> <groupId>javax.transaction</groupId> </exclusion> <p class="indent"> |
5.修改maven-surefire-plugin配置以禁用分叉程式:
<configuration> <forkCount>0</forkCount> </configuration> <p class="indent"> |
當存在module-info.java並且啟用了fork程式時,surefire會建立一個包含模組和未命名模組的混合類路徑,從而導致模組可見性問題並阻止應用程式啟動。
6.打包並測試應用程式。
./mvnw clean package
7.使用Java模組系統執行應用程式:
java --add-opens java.base/java.lang=spring.core,javassist \ --module-path target/modules \ --module spring.petclinic/org.springframework.samples.petclinic.PetClinicApplication <p class="indent"> |
由於Spring和Hibernate依賴項需要JDK反射訪問,因此需要--add -opens。
8.如果使用以下命令設定模組main-class屬性,則可以刪除使用module引數指定的主類:
jar --update \ --file=target/modules/spring-petclinic-2.0.0.BUILD-SNAPSHOT.jar \ --main-class=org.springframework.samples.petclinic.PetClinicApplication <p class="indent"> |
9.為了自動執行上一步,您可以新增exec-maven-plugin:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.6.0</version> <executions> <execution> <id>module-main-class</id> <phase>package</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>jar</executable> <arguments> <argument> --update </argument> <argument> --file=${project.build.directory}/modules/${project.build.finalName}.jar </argument> <argument> --main-class=org.springframework.samples.petclinic.PetClinicApplication </argument> <argument> --module-version=${project.version} </argument> </arguments> </configuration> </execution> </executions> </plugin> <p class="indent"> |
10.現在您可以不需要自己宣告主類的情況下執行應用程式:
./mvnw clean package java --add-opens java.base/java.lang=spring.core,javassist \ --module-path=target/modules \ --module spring.petclinic <p class="indent"> |
相關文章
- 在Java 11中建立一個簡單的模組化應用教程Java
- Java模組化的國際化實現- GunnarJava
- 使用Spring Boot實現模組化Spring Boot
- Egret應用開發實踐(03) MVC 模組化具體實現MVC
- 模組化實現的好處
- iOS應用模組化的思考及落地方案(二)模組化自動構建工具的使用iOS
- Android實現模組 api 化AndroidAPI
- 如何實現css模組化CSS
- 微前端架構將應用拆分為多個小型模組,實現模組化的設計前端架構
- 用函式實現模組化程式設計二函式程式設計
- 用函式實現模組化程式設計三函式程式設計
- 用函式實現模組化程式設計一函式程式設計
- 使用 nodejs 中的 http 模組實現幾個超實用的工具NodeJSHTTP
- 如何將模組化應用於 SQLSQL
- 谷歌助力,快速實現 Java 應用容器化谷歌Java
- webpack是如何實現前端模組化的Web前端
- 用函式實現模組化程式設計習題函式程式設計
- SpringMVC的View模組用什麼實現?SpringMVCView
- 極簡實用的Asp.NetCore模組化框架新增CMS模組ASP.NETNetCore框架
- 使用Docker WildFly和wildfly-maven-plugin實現Java應用容器化DockerMavenPluginJava
- 使用 Router 實現的模組化,如何優雅的回到主頁面
- Nginx使用Lua模組實現WAFNginx
- 模組化單體應用的資料隔離
- 從module的簡單實現到模組化
- 一種app模組化實現方案APP
- 進擊的模組化+webpack的簡單實現Web
- iOS使用觀察者模式實現推送訊息模組化iOS模式
- iOS應用模組化的思考及落地方案(一)模組的劃分及模組化工作流程iOS
- ABP vnext模組化架構的最佳實踐的實現架構
- 私有化倉庫的 GO 模組使用實踐Go
- [Python]OS模組應用Python
- pickle模組 collections模組在物件導向中的應用物件
- 深入理解JVM(③)Java的模組化JVMJava
- Vue響應式資料: Observer模組實現VueServer
- 使用Spring Boot的Configuration和ArchUnit實現元件模組化和清晰邊界 - reflectoringSpring Boot元件
- 你真的懂模組化嗎?教你CommonJS實現JS
- Python技法:用re模組實現簡易tokenizerPython
- PDM應用模組設計