將 Spring Boot 應用遷移到 Java 9 — 模組__Java

來源:互聯網
上載者:User
配置模組中繼資料

Java 9 中的模組資訊通過 module-info.java 檔案實現。第一步是在來源目錄的根目錄下建立一個這樣的檔案,模組名稱為:

module org.springframework.samples.petclinic {}

剩下的旅程可能是天堂或地獄。不過我很幸運受益於 IntelliJ IDEA,這個 IDE 嚮導會準確地說出它不能讀取的類,並允許您將其放入模組檔案中。最後,看起來是這樣的:

module org.springframework.samples.petclinic {    requires java.xml.bind;    requires javax.transaction.api;    requires validation.api;    requires hibernate.jpa;    requires hibernate.validator;    requires spring.beans;    requires spring.core;    requires spring.context;    requires spring.tx;    requires spring.web;    requires spring.webmvc;    requires spring.data.commons;    requires spring.data.jpa;    requires spring.boot;    requires spring.boot.autoconfigure;    requires cache.api;}

請注意, maven-compiler-plugin 和 maven-surefire-plugin 中的模組配置可以被刪除。

不使用 IDE 進行配置

如果你手上恰巧沒有理想的 IDE 環境,配置過程如下:

運行 mvn clean test

分析錯誤記錄檔來擷取缺少的包名

定位到上面提到的包

如果這是一個模組 Jar,那麼把模組名稱加到相依模組名稱列表裡面

否則,猜測一下自動模組名稱(譯註:自動模組名稱(automatic module name)是為了在java 9 項目中使用那些沒有進行模組化處理的包(即沒有 module-info )而出現的概念,它們的名字一般就是去掉了版本號碼的jar包檔案名稱),再加入到相依模組名稱列表裡面

例如:

[ERROR] ~/spring-petclinic/src/main/java/org/springframework/samples/petclinic/system/CacheConfig.java:[21,16]  package javax.cache is not visible[ERROR]   (package javax.cache is declared in the unnamed module, but module javax.cache does not read it)

javax.cache 位於 cache-api-1.0.0.jar中,由於這不是一個模組,所以在 JAR 包中沒有 module-info 檔案。但可知它的自動模組名稱為 cache.api 。將其寫入到模組依賴中。重複上述步驟。 ASM 故障

從這篇文章的第一部分開始,我已經意識到,Spring Boot 1.5 將不會與 Java 9 相容。我們開始吧。

將 Spring Boot 升級到 2.0.0.M5,需要對模組依賴性進行一些更改:

hibernate.validator 變為 org.hibernate.validator

validation.api 變為 java.validation

當你認為它可以工作的時候:

Caused by: java.lang.RuntimeExceptionat org.springframework.asm.ClassVisitor.visitModule(ClassVisitor.java:148)

這個問題已經記錄在案。此時,顯式聲明主類解決了這個問題。

<plugin>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-maven-plugin</artifactId>    <configuration>        <jvmArguments>--add-modules java.xml.bind</jvmArguments>        <mainClass>org.springframework.samples.petclinic.PetClinicApplication</mainClass>    </configuration>    ...</plugin>
Javassist 失敗

現在 app 可以使用以下命令做測試了: mvn clean spring-boot:run 。不幸的是,一個新的異常擋住了我們前行的路:

2017-10-16 17:20:22.552  INFO 45661 --- [           main] utoConfigurationReportLoggingInitializer :Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.2017-10-16 17:20:22.561 ERROR 45661 --- [           main] o.s.boot.SpringApplication               : Application startup failedorg.springframework.beans.factory.BeanCreationException:  Error creating bean with name 'entityManagerFactory' defined in class path resource   [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]:    Invocation of init method failed; nested exception is org.hibernate.boot.archive.spi.ArchiveException:     Could not build ClassFile

快速搜尋下定位到 Java 9 和 Javassit 的一個不相容性問題。Javassist 是這裡的罪魁禍首。它的依賴性需要 Spring Data JPA,通過 Hibernate 傳遞。要解決它,需要移除依賴關係,並添加最新版本:

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-jpa</artifactId>    <exclusions>        <exclusion>            <artifactId>javassist</artifactId>            <groupId>org.javassist</groupId>        </exclusion>    </exclusions></dependency><dependency>    <groupId>org.javassist</groupId>    <artifactId>javassist</artifactId>    <version>3.22.0-GA</version>    <scope>runtime</scope></dependency>

幸運的是,此版本是相容的 —— 最起碼對我們的用法是。 它運行了。

我們做到了! 如果你到了這一步,你應該拍拍肩膀,喝杯啤酒,或者你認為你應該得到的任何東西。

錦上添花的是,開發工具的依賴可以被重新添加。 結論

不管你喜歡還是不喜歡,遷移到 Java 9 需要使用 Jigsaw。至少,這意味著一趟痛苦的旅程,以及遇到錯誤就要搜尋下一個補丁的過程,並且還要刪除構建過程中的重要步驟。對於庫/架構開發人員來說,為他們的內部 api 添加額外的存取控制層是很有趣的,對於應用程式來說這樣做比較少。在這個階段,不值得遷移到 Java 9。

我希望在幾個月後再進行這個實驗,到時候再留意情況的改善。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.