激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語(yǔ)言|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - java9遷移注意問(wèn)題總結(jié)

java9遷移注意問(wèn)題總結(jié)

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

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

本文主要研究下遷移java9的一些注意事項(xiàng)。

遷移種類

1、代碼不模塊化,先遷移到j(luò)dk9上,好利用jdk9的api

2、代碼同時(shí)也模塊化遷移

幾點(diǎn)注意事項(xiàng)

不可讀類

比如sun.security.x509,在java9中歸到j(luò)ava.base模塊中,但是該模塊沒(méi)有export該package
可以通過(guò)運(yùn)行的時(shí)候添加--add-exports java.base/sun.security.x509=ALL-UNNAMED來(lái)修改exports設(shè)定

 

內(nèi)部類

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

 

?
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引入了模塊系統(tǒng),同時(shí)自身的jdk也模塊化了,引入了module-path,來(lái)屏蔽classpath,也就是說(shuō)在java9優(yōu)先使用module-path,畢竟jdk本身都模塊化了,應(yīng)用本身沒(méi)有模塊化的話,java9通過(guò)unnamed modules及automatic modules機(jī)制來(lái)隱式模塊化,當(dāng)然classpath在java9上還能繼續(xù)使用,比如配合module-path使用等。
沒(méi)有模塊化的jar在classpath會(huì)被歸到unnamed modules;在module-path則會(huì)被自動(dòng)創(chuàng)建為automatic modules(一個(gè)automatic modules會(huì)聲明transitive依賴所有named和unnamed module,然后導(dǎo)出自身的package)

 

一個(gè)包名不能在多個(gè)模塊中出現(xiàn)(split packages)

因?yàn)槟K中可以exports指定包給其他模塊,如果多個(gè)模塊exports同樣的包名會(huì)造成混亂,特別若有其他類庫(kù)同時(shí)requires這兩個(gè)模塊,就不知道該引用那個(gè)模塊的了。

傳遞依賴

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

小心循環(huán)依賴

在設(shè)計(jì)模塊的時(shí)候,要盡可能考慮到是否會(huì)有循環(huán)依賴的問(wèn)題,如果有則需要重新設(shè)計(jì)

使用services來(lái)實(shí)現(xiàn)optional依賴

services特別適合用來(lái)解耦調(diào)用方與實(shí)現(xiàn)類依賴的問(wèn)題,如果接口有多種實(shí)現(xiàn)類,調(diào)用方不必要requires所有的實(shí)現(xiàn)類,只需要requires接口即可,使用services類型來(lái)加載實(shí)現(xiàn)類的實(shí)例。通過(guò)在module-path去動(dòng)態(tài)添加實(shí)現(xiàn)模塊實(shí)現(xiàn)解耦。

模塊版本管理

module-info.java不支持聲明版本號(hào),但是創(chuàng)建jar包的時(shí)候,可以通過(guò)--module-version設(shè)置。不過(guò)模塊系統(tǒng)查找模塊的時(shí)候還是使用模塊名來(lái)查找(如果module-path里頭有多個(gè)重名模塊,則模塊系統(tǒng)知會(huì)使用找到的第一個(gè),自動(dòng)忽略后續(xù)的同名模塊),版本依賴問(wèn)題不在模塊系統(tǒng)解決范疇內(nèi),交由maven之類的依賴管理工具去管理。

模塊資源訪問(wèn)

模塊化之后資源文件也收到保護(hù),只能由該模塊去訪問(wèn)本模塊自身的資源文件,如果需要跨模塊訪問(wèn),也必須借助ModuleLayer找到目標(biāo)模塊,再調(diào)用目標(biāo)模塊去加載該模塊的資源文件。

反射的使用

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

 

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

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

上面的做法是在原來(lái)module-info.java里頭去做修改,另外一種是在執(zhí)行java或javac的時(shí)候通過(guò)指定的命令來(lái)修改原來(lái)的關(guān)系。比如

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

如果需要導(dǎo)出給unnamed modules,則target-module為ALL-UNNAMED

當(dāng)然如果是新的系統(tǒng),那就不建議使用反射了,可以使用MethodHandles及VarHandles。

常見問(wèn)題和措施

ClassNotFoundException/NoClassDefFoundError

比如javax.xml.bind.JAXBException,JAXB已經(jīng)歸入到j(luò)ava.xml.bind模塊,在java命名后面添加

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

如果圖省事,把$JAVA_HOME及所有第三方類庫(kù)添加到module-path,然后來(lái)個(gè)

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

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

反射原因引起,由于舊系統(tǒng)沒(méi)有module-info,因此在java命名添加參數(shù)加以修改

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

確定依賴的模塊

通過(guò)IDE或者jdeps分析

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

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

對(duì)模塊單元測(cè)試的可讀性問(wèn)題

如果單元測(cè)試時(shí)單獨(dú)模塊的話,可以在運(yùn)行時(shí)通過(guò)--add-exports或--add-opens來(lái)授予單元測(cè)試模塊對(duì)目標(biāo)模塊的可讀性及反射能力。另外由于split packages問(wèn)題,單元測(cè)試類的包名不能跟目標(biāo)模塊包名重復(fù)。原來(lái)maven工程那種test

小結(jié)

可以分兩步走遷移到j(luò)ava9,首先是先不模塊化,只先跑在jdk9上;然后再模塊化。

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

延伸 · 閱讀

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

    java編程scanner類用法示例

    這篇文章主要介紹了java編程scanner類用法示例,涉及一個(gè)通過(guò)scanner類實(shí)現(xiàn)需要手動(dòng)輸入變量時(shí)進(jìn)行輸入的實(shí)例,然后分享了一個(gè)簡(jiǎn)單的eclipse對(duì)Java代碼格式...

    我來(lái)偷MM4782021-02-23
  • JAVA教程詳解Java正則表達(dá)式語(yǔ)法

    詳解Java正則表達(dá)式語(yǔ)法

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

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

    SpringBoot集成JPA的示例代碼

    本篇文章主要介紹了SpringBoot集成JPA的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧...

    千里明月7422021-03-25
  • JAVA教程Java動(dòng)態(tài)代理詳解及實(shí)例

    Java動(dòng)態(tài)代理詳解及實(shí)例

    這篇文章主要介紹了Java動(dòng)態(tài)代理詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下...

    java教程網(wǎng)2422020-07-27
  • JAVA教程詳解如何解決SSM框架前臺(tái)傳參數(shù)到后臺(tái)亂碼的問(wèn)題

    詳解如何解決SSM框架前臺(tái)傳參數(shù)到后臺(tái)亂碼的問(wèn)題

    這篇文章主要介紹了詳解如何解決SSM框架前臺(tái)傳參數(shù)到后臺(tái)亂碼的問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧...

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

    連Hibernate技術(shù)都不清楚,你敢說(shuō)你自己會(huì)ORM框架?

    ORM框架不是一個(gè)新話題,它已經(jīng)伴隨我們很多年了。它提供了概念性的、易于理解的數(shù)據(jù)模型,將數(shù)據(jù)庫(kù)中的表和內(nèi)存中的對(duì)象建立了很好的映射關(guān)系。在...

    淺羽的IT小屋3322020-11-25
  • JAVA教程詳解三種java實(shí)現(xiàn)多線程的方式

    詳解三種java實(shí)現(xiàn)多線程的方式

    數(shù)據(jù)時(shí)代的到來(lái),多線程一直都是比較關(guān)心的問(wèn)題之一,這篇文章介紹了JAVA實(shí)現(xiàn)多線程的三種方法,有需要的朋友可以參考一下 ...

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

    詳解在Spring Boot中使用JPA

    本篇文章主要介紹了詳解在Spring Boot中使用JPA,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧...

    _江南一點(diǎn)雨2402020-10-07
主站蜘蛛池模板: 国产精品自拍av | 国产精品久久久久久久久久久久久久久 | 人人做人人看 | 一区二区精品视频 | 四季久久免费一区二区三区四区 | 久草热久草视频 | 天天鲁在线视频免费观看 | 日本一区视频在线观看 | 欧美精品成人一区二区在线观看 | 欧美成人h版在线观看 | 免费观看9x视频网站在线观看 | 黄色美女网站免费看 | 亚洲精品一区二区三区免 | 艹逼视频污 | 一级空姐毛片 | 久久国产精品一区 | 日本在线播放一区二区 | 亚洲一区二区三区精品在线观看 | 国产精品视频中文字幕 | 久久精品视频在线免费观看 | 国产亚洲综合精品 | 成人毛片100免费观看 | jizzjizzjizz少妇| 欧洲成人一区二区 | 国产精品国产成人国产三级 | 欧美国产精品一区二区 | 草草视频在线播放 | 国产91对白叫床清晰播放 | 久久久久久久久久久久久久久伊免 | 污黄视频在线观看 | 日本免费a∨| 久久久免费 | 被狠狠操 | 国产精品视频一区二区三区四区五区 | 精品国产一区二区三区四区阿崩 | 日韩精品中文字幕一区二区 | 欧美特级黄色 | 色妹子久久| 久久丝袜脚交足黄网站免费 | 国产欧美精品一区二区三区四区 | 美女一级视频 |