自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java 模塊化系統(tǒng)初探

開(kāi)發(fā) 后端
Java 模塊化系統(tǒng)自提出以來(lái)經(jīng)歷了很長(zhǎng)的時(shí)間,直到 2014 年晚些時(shí)候才最終以 JSR(JSR-376) 定稿,而且這個(gè)部分有可能在 Java 9 中出現(xiàn)。但是一直以來(lái)都沒(méi)有可以使用的原型。9 月 11 日,OpenJDK 發(fā)布的早期構(gòu)建版本終于包含了 Jigsaw 項(xiàng)目。

 Java 模塊化系統(tǒng)自提出以來(lái)經(jīng)歷了很長(zhǎng)的時(shí)間,直到 2014 年晚些時(shí)候才最終以 JSR(JSR-376) 定稿,而且這個(gè)部分有可能在 Java 9 中出現(xiàn)。但是一直以來(lái)都沒(méi)有可以使用的原型。9 月 11 日,OpenJDK 發(fā)布的早期構(gòu)建版本終于包含了 Jigsaw 項(xiàng)目。

[[151504]]

昨天,我和同事 Paul Bakker 在 JavaZone 上對(duì)于 Java 模塊化系統(tǒng)進(jìn)行了討論。整個(gè)討論都建立在JSR-376 需求文檔以及身邊一些珍貴的信息上。在年初提出舉行這個(gè)報(bào)告的時(shí)候,我們?cè)钚挪灰傻卣J(rèn)為在這個(gè)會(huì)上我們能夠展示一個(gè)原型,但是事情卻沒(méi)有按預(yù)想的那樣發(fā) 展?,F(xiàn)在的情況是,這個(gè)原型將在我們的報(bào)告結(jié)束之后發(fā)布。這也意味著,報(bào)告中的一些內(nèi)容已經(jīng)有點(diǎn)過(guò)時(shí)了,但是主要的思想還是很有新意的。如果你對(duì) Java 模塊化系統(tǒng)方案一無(wú)所知的話,建議你在閱讀這篇文章之前先去看一下我們的報(bào)告。我們的報(bào)告介紹了現(xiàn)在的方案,并進(jìn)一步與 OSGi 進(jìn)行了比較。

為什么要使用模塊?

什么是模塊?我們?yōu)槭灿中枰鼈儯咳绻M幸粋€(gè)深入的討論,請(qǐng)閱讀“State of the module system”或者看一下我們的報(bào)告。對(duì)這塊還不是很了解的人來(lái)說(shuō),這里有Cliff 的注釋版本。

我們都知道 Java 有 jar 文件。但是,事實(shí)上這些都只是包含一些class(類)的壓縮文件,這些 jar 包內(nèi)部都是一些 package (包)。當(dāng)你利用一些不同的 jar 包來(lái)運(yùn)行應(yīng)用程序的時(shí)候(復(fù)雜一點(diǎn)的程序也適用),你需要把它們放到指定的類路徑中。然后默默祈禱。因?yàn)闆](méi)有有效的工具來(lái)幫助你知道,你是否已經(jīng)把應(yīng)用所 需要的 jar 包都放入類路徑中了?;蛘哂锌赡苣阍诓唤?jīng)意間將同樣的類文件(在不同的 jar 包中)都放入了類路徑中。類路徑災(zāi)難(類似于 DLL 災(zāi)難)是真實(shí)存在的。這會(huì)導(dǎo)致運(yùn)行時(shí)出現(xiàn)糟糕的狀況。同時(shí),在運(yùn)行時(shí)我們也無(wú)法得知 jar 中包含哪些類。從 JRE 角度來(lái)說(shuō)只知道有一堆類文件。事實(shí)上 jar 包之間是相互依賴的,但目前還不能把這種依賴關(guān)系記錄到數(shù)據(jù)文件中去。理想的情況是,你可以隱藏 jar 包中類文件具體的實(shí)現(xiàn),只是提供一些公共的 API 。在 Java 中提出模塊化系統(tǒng)就是為了解決這些問(wèn)題的:

  • 模塊成為首先要考慮的部分,它能夠分裝實(shí)現(xiàn)細(xì)節(jié)并且只暴露需要的接口。

  • 模塊準(zhǔn)確地描述了他們能夠提供的接口,以及他們的需要部分(依賴)。由此,我們可以在開(kāi)發(fā)的過(guò)程中弄清和處理依賴關(guān)系。

模塊系統(tǒng)極大地提升了大型系統(tǒng)的可維護(hù)性、可靠性、安全性。至少 JDK 本身還缺少這樣的系統(tǒng)。通過(guò)這樣的模塊系統(tǒng),模塊圖能夠自動(dòng)地構(gòu)建。這個(gè)圖只包括了你的應(yīng)用程序運(yùn)行時(shí)所須要的模塊。

安裝 JDK9 預(yù)覽版

如果你想親自嘗試編寫示例代碼,你需要安裝包含 Jigsaw 原型的 JDK9 早期構(gòu)建版本。在 OSX 上,你需要解壓文檔,然后把解壓出來(lái)的目錄移動(dòng)到 Library/Java/JavaVirtualMachines/ 下。然后你需要設(shè)置環(huán)境變量,將 JAVA_HOME 環(huán)境變量指向 JDK9 的目錄。我使用了非常好用的setjdk 腳本,通過(guò)它可以在命令窗口中實(shí)現(xiàn) Java 安裝的命令切換。你很有可能不愿意使用這個(gè)早期構(gòu)建版本作為你的 Java 安裝版本。你可以通過(guò) java -version 來(lái)確認(rèn)安裝完成。輸出如下面所示:

1

2

3

java version "1.9.0-ea"

Java(TM) SE Runtime Environment (build 1.9.0-ea-jigsaw-nightly-h3337-20150908-b80)

Java HotSpot(TM) 64-Bit Server VM (build 1.9.0-ea-jigsaw-nightly-h3337-20150908-b80, mixed mode)

只要輸出中包含 Jigsaw ,你就可以繼續(xù)了。文章后面的示例代碼可以去 https://github.com/sandermak/jigsaw-firstlook 下載。

一個(gè)簡(jiǎn)單的例子

你仍舊可以通過(guò)類、jar包以及類路徑這樣“傳統(tǒng)方式”的方式來(lái)使用 JDK9 。但是明顯地我們想要采用模塊的方式。所以我們將創(chuàng)建一個(gè)包含兩個(gè)模塊的工程:模塊一使用了模塊二中的代碼。

首先要做的就是,構(gòu)建我們的工程并把兩個(gè)模塊很好地區(qū)分開(kāi)來(lái)。然后,模塊中需要以 module-info.java 文件的形式添加元數(shù)據(jù)。我們的示例構(gòu)建如下:

1

2

3

4

5

6

7

src

  module1

     module-info.java

     comtestTestClassModule1.java

  module2

     module-info.java

     commoretestTestClassModule2.java

接著,我們將介紹 package (包)層最頂上的一層(module1、 module2),這部分你在之前已經(jīng)構(gòu)建好了。在這些“模塊目錄”中,可以看到 module-info.java 文件在根目錄下。此外請(qǐng)注意,這兩個(gè)類都是在顯示命名的包中的。

請(qǐng)看 TestClassModule1 的代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

package com.test;

 

import com.moretest.TestClassModule2;

 

public class TestClassModule1 {

 

   public static void main(String[] args) {

 

     System.out.println("Hi from " + TestClassModule2.msg());

 

   }

 

}

看起來(lái)很普通對(duì)吧?這里并沒(méi)有涉及模塊,而是導(dǎo)入了 TestClassModule2 ,主函數(shù)之后會(huì)去調(diào)用其中的 msg() 方法。

1

2

3

4

5

6

7

8

9

10

11

package com.moretest;

 

public class TestClassModule2 {

 

   public static String msg() {

 

     return "from module 2!";

 

   }

 

}

到目前為止,module-info.java 還是空的。

對(duì) Java 模塊進(jìn)行編譯

現(xiàn)在進(jìn)行下一步:編譯我們的模塊,并關(guān)聯(lián)源文件。為了做這項(xiàng)工作,我們將介紹一個(gè)新的 javac 編譯參數(shù):

1

javac -modulesourcepath src -d mods $(find src -name '*.java')

使用上面語(yǔ)句時(shí),我們假設(shè)命令程序已經(jīng)處于 src 文件夾的上級(jí)目錄中了。-modulesourcepath 參數(shù)會(huì)讓 javac 從傳統(tǒng)編譯模式進(jìn)入模塊模式。-d 標(biāo)記指出了編譯好的模塊的輸出目錄。javac 將以非打包文件的形式輸出這些模塊。如果我們這之后想以 jars 的形式使用這些模塊的話,需要一個(gè)單獨(dú)的步驟。

那么當(dāng)我們調(diào)用上面的 javac 命令行的時(shí)候會(huì)發(fā)生什么那?編譯出錯(cuò)了!

1

2

src/module1/module-info.java:1: error: expected 'module'

src/module2/module-info.java:1: error: expected 'module'

空的 module-info.java 文件導(dǎo)致了這個(gè)錯(cuò)誤。所以,一些新的關(guān)鍵字將被引入到這些文件中來(lái),這些都是模塊中非常重要的部分。這些關(guān)鍵字的作用域就是 module-info.java 的定義部分。你還可以在 java 的源文件中使用 module 類型的變量。

我們采用了最少的描述信息,并更新了模塊描述文件:

1

module module1 { }

然后是模塊2:

1

module module2{ }

現(xiàn)在,模塊已經(jīng)被準(zhǔn)確地命名了,但是還沒(méi)有包含其它的數(shù)據(jù)。再次編譯會(huì)導(dǎo)致新的錯(cuò)誤:

1

src/module1/com/test/TestClassModule1.java:3: error: TestClassModule2 is not visible because package com.moretest is not visible

封裝出現(xiàn)了!默認(rèn)情況下,模塊內(nèi)部的類或者其他類型對(duì)外都是隱藏的。這就是 javac 不允許使用 TestClassModule2 的原因,即使它是一個(gè)公共的類。如果我們還是使用基于傳統(tǒng)類路徑的編譯的話,一切都可以正常運(yùn)作。當(dāng)然我們也可以通過(guò)明確地將 TestClassModule2 暴露給外部來(lái)解決這個(gè)問(wèn)題。接下來(lái)的這些改變對(duì)于 module2 中的 module-info.java 來(lái)說(shuō)是必須的:

1

2

3

4

5

module module2 {

 

  exports com.moretest;

 

}

這還不夠。如果你將修改后的編譯,你會(huì)得到同樣的錯(cuò)誤。那是因?yàn)?,雖然現(xiàn)在 module2 已經(jīng)暴露了所需的包(包含所有的公共類型),但是 module1 還沒(méi)有聲明它對(duì) module2 的依賴。我們同樣可以改變 module1 的 module-info.java 文件來(lái)解決這個(gè)問(wèn)題:

1

2

3

4

5

module module1 {

 

   requires module2;

 

}

通過(guò)指定名字的方法可以表示對(duì)其它模塊的依賴,盡管在這些模塊中是以包的形式導(dǎo)出的。這方面還有很多可以說(shuō)的東西,但是我并不想在初步的介紹中涉 及。在做完這一步之后,我們使用 Jigsaw ***次成功編譯了多模塊項(xiàng)目。如果你打開(kāi) /mods 目錄,你能看到編譯出來(lái)的東西被整齊地劃分為兩個(gè)目錄。這就成功了!

運(yùn)行模塊化代碼

只是編譯的話并沒(méi)有多大樂(lè)趣。我們希望應(yīng)用程序能夠運(yùn)行起來(lái)。幸運(yùn)的是,JRE 和 JDK 已經(jīng)在這個(gè)原型中支持模塊關(guān)聯(lián)。這個(gè)應(yīng)用可以通過(guò)指定模塊路徑的方式來(lái)啟動(dòng),而不是類路徑:

1

java -mp mods -m module1/com.test.TestClassModule1

我們把模塊路徑指向 mods 文件夾,這個(gè)文件就是 javac 編譯時(shí)寫輸出模塊的地方。而 -m 指出了最初要啟動(dòng)的模塊,通過(guò)這個(gè)模塊可以逐步啟動(dòng)其他模塊。我們同樣添加了在初始化時(shí)需要調(diào)用的啟動(dòng)類的名字,運(yùn)行結(jié)果如下所示:

1

Hi from from module 2!

未來(lái)

這部分介紹可以讓你初步了解可以使用 Java 9 中的模塊可以做什么。這部分還是需要更多的探索。就像打包一樣:除了jar包,即將會(huì)有一種新的形式叫做 jmod 。這個(gè)模塊化系統(tǒng)同樣包括一個(gè)服務(wù)層,它可以通過(guò)接口綁定服務(wù)提供者和服務(wù)使用者??梢园堰@個(gè)看成反轉(zhuǎn)控制:模塊系統(tǒng)擔(dān)任服務(wù)注冊(cè)管理的角色。還有一個(gè)值 得期待的地方是,JDK 本身將會(huì)如何使用模塊化系統(tǒng)進(jìn)行模塊化。這有可能支持一些非常棒的技術(shù),比如創(chuàng)建一個(gè)運(yùn)行時(shí)鏡像,這個(gè)鏡像可以只包括 JDK 和你應(yīng)用所需要的那些模塊。好處有:占用更少的空間,對(duì)于程序整體的優(yōu)化可以有更多的選擇等等。這些前景都是很光明的。

我接下來(lái)將嘗試移植一個(gè)簡(jiǎn)單的 OSGi 應(yīng)用程序(該程序會(huì)使用一些模塊和服務(wù))到 Java 9 模塊系統(tǒng)上。敬請(qǐng)關(guān)注!

原文鏈接: dzone 翻譯: ImportNew.com - 閔 大為
譯文鏈接: http://www.importnew.com/16761.html

 

 

 
責(zé)任編輯:王雪燕 來(lái)源: ImportNew
相關(guān)推薦

2019-08-28 16:18:39

JavaScriptJS前端

2018-03-21 21:31:28

Java9編程Java

2009-10-28 13:29:14

Linux文件系統(tǒng)安裝

2013-08-20 15:31:18

前端模塊化

2017-05-18 10:23:55

模塊化開(kāi)發(fā)RequireJsJavascript

2020-09-17 10:30:21

前端模塊化組件

2020-09-18 09:02:32

前端模塊化

2022-03-11 13:01:27

前端模塊

2010-02-03 09:01:01

Java動(dòng)態(tài)模塊化

2010-03-24 08:34:44

OSGiJava模塊化

2009-12-10 11:04:08

Java模塊化OSGiJigsaw

2022-09-05 09:01:13

前端模塊化

2018-06-21 09:36:09

模塊化數(shù)據(jù)中心集中化

2019-09-02 10:51:59

Python腳本語(yǔ)言程序員

2017-05-18 11:43:41

Android模塊化軟件

2016-10-09 11:03:41

Javascript模塊化Web

2016-12-21 17:02:35

數(shù)據(jù)中心MDC模塊化

2017-09-22 18:50:50

模塊化Java 9發(fā)布

2022-09-21 11:51:26

模塊化應(yīng)用

2009-07-09 17:59:16

模塊化系統(tǒng)英特爾服務(wù)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)