1. 程式人生 > 其它 >將Spring引導應用程式遷移到Java 9-模組

將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,一般需求都能搞定。

  但是所學的知識點沒有系統化,很難在技術領域繼續突破的。