国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - java9遷移注意問題總結

java9遷移注意問題總結

2021-04-07 14:14codecraft JAVA教程

本篇文章給大家詳細整理了java9遷移注意的問題,希望我們整理的內容能夠幫助到大家。

本文主要研究下遷移java9的一些注意事項。

遷移種類

1、代碼不模塊化,先遷移到jdk9上,好利用jdk9的api

2、代碼同時也模塊化遷移

幾點注意事項

不可讀類

比如sun.security.x509,在java9中歸到java.base模塊中,但是該模塊沒有export該package
可以通過運行的時候添加--add-exports java.base/sun.security.x509=ALL-UNNAMED來修改exports設定

 

內部類

比如sun.misc.Unsafe,原本只想讓oracle jdk team來使用,不過由于這些類應用太廣泛了,為了向后兼容,java9做了妥協,只是將這些類歸到了jdk.unsupported模塊,并沒有限定其可讀性。

 

?
1
2
3
4
5
6
7
8
? ~ java -d jdk.unsupported
jdk.unsupported@9
exports com.sun.nio.file
exports sun.misc
exports sun.reflect
requires java.base mandated
opens sun.misc
opens sun.reflect

 

刪除的類

java9刪除了sun.misc.BASE64Encoder,這種情況只能改用其他api,比如java.util.Base64

 

classpath vs module-path

java9引入了模塊系統,同時自身的jdk也模塊化了,引入了module-path,來屏蔽classpath,也就是說在java9優先使用module-path,畢竟jdk本身都模塊化了,應用本身沒有模塊化的話,java9通過unnamed modules及automatic modules機制來隱式模塊化,當然classpath在java9上還能繼續使用,比如配合module-path使用等。
沒有模塊化的jar在classpath會被歸到unnamed modules;在module-path則會被自動創建為automatic modules(一個automatic modules會聲明transitive依賴所有named和unnamed module,然后導出自身的package)

 

一個包名不能在多個模塊中出現(split packages)

因為模塊中可以exports指定包給其他模塊,如果多個模塊exports同樣的包名會造成混亂,特別若有其他類庫同時requires這兩個模塊,就不知道該引用那個模塊的了。

傳遞依賴

如果一個模塊的接口參數或返回類型使用了其他模塊的類,則建議requires transitive它依賴的模塊

小心循環依賴

在設計模塊的時候,要盡可能考慮到是否會有循環依賴的問題,如果有則需要重新設計

使用services來實現optional依賴

services特別適合用來解耦調用方與實現類依賴的問題,如果接口有多種實現類,調用方不必要requires所有的實現類,只需要requires接口即可,使用services類型來加載實現類的實例。通過在module-path去動態添加實現模塊實現解耦。

模塊版本管理

module-info.java不支持聲明版本號,但是創建jar包的時候,可以通過--module-version設置。不過模塊系統查找模塊的時候還是使用模塊名來查找(如果module-path里頭有多個重名模塊,則模塊系統知會使用找到的第一個,自動忽略后續的同名模塊),版本依賴問題不在模塊系統解決范疇內,交由maven之類的依賴管理工具去管理。

模塊資源訪問

模塊化之后資源文件也收到保護,只能由該模塊去訪問本模塊自身的資源文件,如果需要跨模塊訪問,也必須借助ModuleLayer找到目標模塊,再調用目標模塊去加載該模塊的資源文件。

反射的使用

這里涉及到deep reflection問題,所謂的deep reflection就是通過反射去調用一個class的非public元素。module-info.java的exports聲明package只是允許該package直接所屬的類允許訪問其public元素,并不允許反射調用非public元素。

 

反射在模塊系統里頭需要特殊聲明才允許使用(使用opens聲明允許deep reflection),這樣就導致很多使用反射的類庫諸如spring,需要額外配置才能遷移到java9。解決方案有兩個:一個是opens package包名給需要反射的模塊,比如spring.beans等;一個就是直接opens整個模塊。

默認--illegal-access=permit,同時該設置只適用于java9之前的package在java9被不允許訪問,不適用于java9中新的不允許訪問的package.(建議遷移到模塊化系統時設置為deny)
不過就是在模塊系統中包名不一樣就屬于不同的包,沒有繼承關系,比如com.service.func1與com.service.func2這兩個是不同的包,你不能只opens com.service,必須分別指定這樣就導致需要open的的package比較多。因此open整個module可能更省事一點,但也屬于比較粗暴的做法。

上面的做法是在原來module-info.java里頭去做修改,另外一種是在執行java或javac的時候通過指定的命令來修改原來的關系。比如

?
1
java ... --add-opens source-module/source-package=target-module

如果需要導出給unnamed modules,則target-module為ALL-UNNAMED

當然如果是新的系統,那就不建議使用反射了,可以使用MethodHandles及VarHandles。

常見問題和措施

ClassNotFoundException/NoClassDefFoundError

比如javax.xml.bind.JAXBException,JAXB已經歸入到java.xml.bind模塊,在java命名后面添加

?
1
--add-modules java.xml.bind

如果圖省事,把$JAVA_HOME及所有第三方類庫添加到module-path,然后來個

?
1
--add-modules ALL-MODULE-PATH

illegal reflective access by xxx to method java.lang.ClassLoader.defineClass

反射原因引起,由于舊系統沒有module-info,因此在java命名添加參數加以修改

?
1
--add-opens java.base/java.lang=ALL-UNNAMED

確定依賴的模塊

通過IDE或者jdeps分析

?
1
jdeps --class-path 'classes/lib/*' -recursive -summary app.jar

jdeps只是靜態代碼分析,如果有使用反射用的類jdeps分析不出來,需要自己手工requires,如果dependency是optional的,可以requires static

對模塊單元測試的可讀性問題

如果單元測試時單獨模塊的話,可以在運行時通過--add-exports或--add-opens來授予單元測試模塊對目標模塊的可讀性及反射能力。另外由于split packages問題,單元測試類的包名不能跟目標模塊包名重復。原來maven工程那種test

小結

可以分兩步走遷移到java9,首先是先不模塊化,只先跑在jdk9上;然后再模塊化。

原文鏈接:https://segmentfault.com/a/1190000013398709

延伸 · 閱讀

精彩推薦
  • JAVA教程java編程scanner類用法示例

    java編程scanner類用法示例

    這篇文章主要介紹了java編程scanner類用法示例,涉及一個通過scanner類實現需要手動輸入變量時進行輸入的實例,然后分享了一個簡單的eclipse對Java代碼格式...

    我來偷MM4782021-02-23
  • JAVA教程詳解Java正則表達式語法

    詳解Java正則表達式語法

    這篇文章主要介紹了Java正則表達式語法,包括常用正則表達式、匹配驗證-驗證Email是否正確以及字符串中查詢字符或者字符串,感興趣的小伙伴們可以參考...

    lijiao3162020-03-11
  • JAVA教程SpringBoot集成JPA的示例代碼

    SpringBoot集成JPA的示例代碼

    本篇文章主要介紹了SpringBoot集成JPA的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    千里明月7422021-03-25
  • JAVA教程Java動態代理詳解及實例

    Java動態代理詳解及實例

    這篇文章主要介紹了Java動態代理詳解及實例的相關資料,需要的朋友可以參考下...

    java教程網2422020-07-27
  • JAVA教程詳解如何解決SSM框架前臺傳參數到后臺亂碼的問題

    詳解如何解決SSM框架前臺傳參數到后臺亂碼的問題

    這篇文章主要介紹了詳解如何解決SSM框架前臺傳參數到后臺亂碼的問題,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    我是帥帥的玉米7322021-02-26
  • JAVA教程連Hibernate技術都不清楚,你敢說你自己會ORM框架?

    連Hibernate技術都不清楚,你敢說你自己會ORM框架?

    ORM框架不是一個新話題,它已經伴隨我們很多年了。它提供了概念性的、易于理解的數據模型,將數據庫中的表和內存中的對象建立了很好的映射關系。在...

    淺羽的IT小屋3322020-11-25
  • JAVA教程詳解三種java實現多線程的方式

    詳解三種java實現多線程的方式

    數據時代的到來,多線程一直都是比較關心的問題之一,這篇文章介紹了JAVA實現多線程的三種方法,有需要的朋友可以參考一下 ...

    korelAK4642020-01-02
  • JAVA教程詳解在Spring Boot中使用JPA

    詳解在Spring Boot中使用JPA

    本篇文章主要介紹了詳解在Spring Boot中使用JPA,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    _江南一點雨2402020-10-07
主站蜘蛛池模板: 亚洲视频在线看 | 色接久久 | 久久久天堂国产精品女人 | 97热在线观看 | 国产一区久久久 | 欧美成人精品一区 | 欧美在线观看黄 | 国产一区二区免费 | 日韩成人av电影 | 性激烈欧美三级在线播放狩猎 | 国产精品久久久久久久久久 | 自拍偷拍 国产 | 久久99精品久久久久久久青青日本 | 国产日韩欧美在线观看 | 欧美日韩精品一区二区在线播放 | 91羞羞网站 | 激情六月婷 | 国产高清av在线一区二区三区 | 欧美区视频 | 在线观看av片 | 午夜在线观看视频 | 日韩国产| 都市激情国产 | 啪啪导航 | 日韩av成人在线观看 | 久久久精品视频网站 | 日韩av一区二区在线观看 | 国产日韩欧美在线观看 | 国产艹| 国内精品视频 | 久操色| 成人国产精品久久久 | 欧美a v在线播放 | 国产淫片在线观看 | 国产精品一卡二卡三卡 | 色综合天天综合网国产成人网 | 天堂网av在线 | 色综合中文| 美日韩精品视频 | 亚洲精品乱码 | 欧美福利视频 |