將Spring引導應用程式遷移到Java 9-模組
配置模組元資料
Java 9中的模組資訊通過module-info.java檔案實現。第一步是在源目錄的根目錄下建立一個這樣的檔案,模組名稱為:
module org .springframework .samples .petclinic {}
其餘的旅程可以是天堂或地獄。我很幸運受益於IntelliJ IDEA許可證。IDE會告訴它什麼類,它不能讀取,一個嚮導可以將它放在模組檔案中。最後,它看起來像:
module org.springframework.samples.petclinic { requires java.xml.bind; 需要 javax.transaction.api; 需要 validation.api; 需要 hibernate.jpa; 需要 hibernate.validator; 需要春天 需要 spring.core; 需要 spring.context; 需要 spring.tx; 需要 spring.web; 需要 spring.webmvc; 需要 spring.datamons; 需要 spring.data.jpa; 需要 spring.boot; 需要 spring.boot.autoconfigure; 需要 cache.api;}
請注意,在該模組的配置maven-compiler-plugin和maven-surefire-plugin可以被刪除。
配置未輔助的方式
如果您碰巧處於不太理想的環境中,則該過程如下:
跑 mvn clean test
分析日誌中的錯誤以獲取有問題的包
找到所述包裝的JAR
如果JAR是模組,請將模組名稱新增到所需模組列表中
如果沒有,請計算自動模組名稱,並將其新增到需要模組的列表中
例如:
[ERROR]?/ spring-petclinic / src / main / java / org / springframework / samples / petclinic / system / CacheConfig。的java: [ 21,16 ]
程式包javax.cache 不可見(錯誤)(javax.cache包在未命名的模組中宣告,但是javax.cache 模組沒有讀取它)
javax.cache位於cache-api-1.0.0.jar。這不是一個模組,因為module-infoJAR中沒有。自動模組名稱為cache.api。把它寫成requires模組中的一個。沖洗並重復。
ASM故障
自從這篇文章的第一部分,我已經意識到,Spring Boot 1.5將不會與Java 9相容。我們開始做吧。
將彈簧引導到2.0.0.M5需要對模組依賴性進行一些更改:
hibernate.validator 至 org.hibernate.validator
validation.api 至 java.validation
只要你認為它可能工作:
造成 的:java的.lang timeException
在 組織.springframework .ASM .ClassVisitor .visitModule(ClassVisitor 的.java :148)
這個問題已經記錄在案。此時,明確宣告主類可解決問題。
< 外掛 >
< 的groupId > org.springframework.boot
< artifactId的 >彈簧引導行家-外掛
< 配置 >
< jvmArguments > --add模組java.xml.bind
< mainClass > org.springframework.samples.petclinic.PetClinicApplication
...
Javassist失敗
該應用程式現在已經準備好進行測試了mvn clean spring-boot:run。不幸的是,我們有一個新的例外:
2021 -10 -16 17:20:22.552 INFO 45661 --- [main] utoConfigurationReportLoggingInitializer:啟動ApplicationContext時出錯。為了顯示汽車構型的報告重新執行你的應用程式與 啟用“除錯”。2021 -10 -16 17:20:22.561 錯誤 45661 --- [main] osboot.SpringApplication:
應用啟動失敗org.springframework.beans.factory.BeanCreationException:
錯誤建立豆與名'的entityManagerFactory'在類路徑資源定義
[組織/ springframework的的/ boot /自動配置/ ORM / JPA / HibernateJpaAutoConfiguration。班級 ]:
呼叫的 init方法失敗; 巢狀異常是 org.hibernate.boot.archive.spi.ArchiveException:
能不能建立ClassFile的
快速搜尋重定向到Java 9和Javassist之間的不相容性。Javassist是這裡的罪魁禍首。依賴關係需要Spring Data JPA,通過Hibernate傳遞。要解決它,排除依賴關係,並新增最新版本:
< dependency >
< groupId > org.springframework.boot
< artifactId > spring-boot-starter-data-jpa
< 排除 >
< 排除 >
< artifactId > javassist
< groupId > org。了Javassist
< 依賴性 >
< 的groupId > org.javassist
< artifactId的 >了Javassist
< 版本 > 3.22.0-GA
< scope > runtime
幸運的是,版本是相容的 - 至少對於我們的使用。
有用!
我們做到了!如果你到達這一點,你應該在肩上輕拍,一杯啤酒,或任何你認為應得的東西。
在蛋糕上結冰,可以重新新增開發工具依賴關係。
結論
遷移到Java 9需要使用拼圖,無論你喜歡還是不喜歡。至少這意味著一個痛苦的試驗和錯誤搜尋 - 下一個修復過程,並刪除構建過程中的重要步驟。儘管圖書館/框架開發人員對其內部API添加了一個額外的訪問控制層也是非常有趣的,但對於應用程式來說,這一點更是如此。在這個階段,不值得轉移到Java 9。
我希望在幾個月後再次進行這個實驗,並注意到情況有所改善。
1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,
需要突破技術瓶頸的。2、在公司待久了,過得很安逸,
但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的。
3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,
常用設計思想,常用java開發框架掌握熟練的。
4、覺得自己很牛B,一般需求都能搞定。
但是所學的知識點沒有系統化,很難在技術領域繼續突破的。