国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
關(guān)于 JAR 您不知道的 5 件事

Java Archive 不僅僅是一堆類

Ted Neward, 主管, Neward & Associates

 

簡介: 除了一些基礎(chǔ)的 JAR 之外,許多 Java? 開發(fā)人員絕沒有想到 — 僅使用它們就可以綁定類。但 JAR 不僅僅是一個重命名的 ZIP 文件。在本文中,您將學(xué)習(xí)如何最大限度地使用 Java Archive 文件,包括 jarring Spring 依賴項和配置文件的一些技巧。

發(fā)布日期: 2010 年 7 月 22 日
級別: 初級 其他語言版本: 英文
建議: 0 (添加評論)

平均分 (共 2 個評分 )

對于大多數(shù) Java 開發(fā)人員來說,JAR 文件及其 “近親” WAR 和 EAR 都只不過是漫長的 Ant 或 Maven 流程的最終結(jié)果。標(biāo)準(zhǔn)步驟是將一個 JAR 復(fù)制到服務(wù)器(或者,少數(shù)情況下是用戶機)中的合適位置,然后忘記它。

事實上,JAR 能做的不止是存儲源代碼,您應(yīng)該了解 JAR 還能做什么,以及如何進行。在這一期的 5 件事 系列中,將向您展示如何最大限度地利用 Java Archive 文件(有時候也可是 WAR 和 EAR),特別是在部署時。

由于有很多 Java 開發(fā)人員使用 Spring(因為 Spring 框架給傳統(tǒng)的 JAR 使用帶來一些特有的挑戰(zhàn)),這里有幾個具體技巧用于在 Spring 應(yīng)用程序中處理 JAR 。

關(guān)于本系列

您覺得自己懂 Java 編程?事實是,大多數(shù)開發(fā)人員都只領(lǐng)會到了 Java 平臺的皮毛,所學(xué)也只夠應(yīng)付工作。在本 系列 中,Ted Neward 深度挖掘 Java 平臺的核心功能,揭示一些鮮為人知的事實,幫助您解決最棘手的編程困難。

我將以一個標(biāo)準(zhǔn) Java Archive 文件產(chǎn)生過程的簡單示例開始,這將作為以下技巧的基礎(chǔ)。

把它放在 JAR 中

通常,在源代碼被編譯之后,您需要構(gòu)建一個 JAR 文件,使用 jar 命令行實用工具,或者,更常用的是 Ant jar 任務(wù)將 Java 代碼(已經(jīng)被包分離)收集到一個單獨的集合中,過程簡潔易懂,我不想在這做過多的說明,稍后將繼續(xù)說明如何構(gòu)建 JAR。現(xiàn)在,我只需要存檔 Hello,這是一個獨立控制臺實用工具,對于執(zhí)行打印消息到控制臺這個任務(wù)十分有用。如清單 1 所示:


清單 1. 存檔控制臺實用工具
            package com.tedneward.jars;            public class Hello            {            public static void main(String[] args)            {            System.out.println("Howdy!");            }            }            

Hello 實用工具內(nèi)容并不多,但是對于研究 JAR 文件卻是一個很有用的 “腳手架”,我們先從執(zhí)行此代碼開始。


1. JAR 是可執(zhí)行的

.NET 和 C++ 這類語言一直是 OS 友好的,只需要在命令行(helloWorld.exe)引用其名稱,或在 GUI shell 中雙擊它的圖標(biāo)就可以啟動應(yīng)用程序。然而在 Java 編程中,啟動器程序 — java — 將 JVM 引導(dǎo)入進程中,我們需要傳遞一個命令行參數(shù)(com.tedneward.Hello)指定想要啟動的 main() 方法的類。

這些附加步驟使使用 Java 創(chuàng)建界面友好的應(yīng)用程序更加困難。不僅終端用戶需要在命令行輸入所有參數(shù)(終端用戶寧愿避開),而且極有可能使他或她操作失誤以及返回一個難以理解的錯誤。

這個解決方案使 JAR 文件 “可執(zhí)行” ,以致 Java 啟動程序在執(zhí)行 JAR 文件時,自動識別哪個類將要啟動。我們所要做的是,將一個入口引入 JAR 文件清單文件(MANIFEST.MF 在 JAR 的 META-INF 子目錄下),像這樣:


清單 2. 展示入口點!
            Main-Class: com.tedneward.jars.Hello            

這個清單文件只是一個名值對。因為有時候清單文件很難處理回車和空格,然而在構(gòu)建 JAR 時,使用 Ant 來生成清單文件是很容易的。在清單 3 中,使用 Ant jar 任務(wù)的 manifest 元素來指定清單文件:


清單 3. 構(gòu)建我的入口點!
            <target name="jar" depends="build">            <jar destfile="outapp.jar" basedir="classes">            <manifest>            <attribute name="Main-Class" value="com.tedneward.jars.Hello" />            </manifest>            </jar>            </target>            

現(xiàn)在用戶在執(zhí)行 JAR 文件時需要做的就是通過 java -jar outapp.jar 在命令行上指定其文件名。就 GUI shell 來說,雙擊 JAR 文件即可。


2. JAR 可以包括依賴關(guān)系信息

似乎 Hello 實用工具已經(jīng)展開,改變實現(xiàn)的需求已經(jīng)出現(xiàn)。Spring 或 Guice 這類依賴項注入(DI)容器可以為我們處理許多細節(jié),但是仍然有點小問題:修改代碼使其含有 DI 容器的用法可能導(dǎo)致清單 4 所示的結(jié)果,如:


清單 4. Hello、Spring world!
            package com.tedneward.jars;            import org.springframework.context.*;            import org.springframework.context.support.*;            public class Hello            {            public static void main(String[] args)            {            ApplicationContext appContext =            new FileSystemXmlApplicationContext("./app.xml");            ISpeak speaker = (ISpeak) appContext.getBean("speaker");            System.out.println(speaker.sayHello());            }            }            

關(guān)于 Spring 的更多信息

這個技巧將幫助您熟悉依賴項注入和 Spring 框架。如果您需要溫習(xí)其他主題,見 參考資料。

由于啟動程序的 -jar 選項將覆蓋 -classpath 命令行選項中的所有內(nèi)容,因此運行這些代碼時,Spring 必須是在 CLASSPATH 環(huán)境變量中。幸運的是,JAR 允許在清單文件中出現(xiàn)其他的 JAR 依賴項聲明,這使得無需聲明就可以隱式創(chuàng)建 CLASSPATH,如清單 5 所示:


清單 5. Hello、Spring CLASSPATH!
            <target name="jar" depends="build">            <jar destfile="outapp.jar" basedir="classes">            <manifest>            <attribute name="Main-Class" value="com.tedneward.jars.Hello" />            <attribute name="Class-Path"            value="./lib/org.springframework.context-3.0.1.RELEASE-A.jar            ./lib/org.springframework.core-3.0.1.RELEASE-A.jar            ./lib/org.springframework.asm-3.0.1.RELEASE-A.jar            ./lib/org.springframework.beans-3.0.1.RELEASE-A.jar            ./lib/org.springframework.expression-3.0.1.RELEASE-A.jar            ./lib/commons-logging-1.0.4.jar" />            </manifest>            </jar>            </target>            

注意 Class-Path 屬性包含一個與應(yīng)用程序所依賴的 JAR 文件相關(guān)的引用。您可以將它寫成一個絕對引用或者完全沒有前綴。這種情況下,我們假設(shè) JAR 文件同應(yīng)用程序 JAR 在同一個目錄下。

不幸的是,value 屬性和 Ant Class-Path 屬性必須出現(xiàn)在同一行,因為 JAR 清單文件不能處理多個 Class-Path 屬性。因此,所有這些依賴項在清單文件中必須出現(xiàn)在一行。當(dāng)然,這很難看,但為了使 java -jar outapp.jar 可用,還是值得的!


3. JAR 可以被隱式引用

如果有幾個不同的命令行實用工具(或其他的應(yīng)用程序)在使用 Spring 框架,可能更容易將 Spring JAR 文件放在公共位置,使所有實用工具能夠引用。這樣就避免了文件系統(tǒng)中到處都有 JAR 副本。Java 運行時 JAR 的公共位置,眾所周知是 “擴展目錄” ,默認(rèn)位于 lib/ext 子目錄,在 JRE 的安裝位置之下。

JRE 是一個可定制的位置,但是在一個給定的 Java 環(huán)境中很少定制,以至于可以完全假設(shè) lib/ext 是存儲 JAR 的一個安全地方,以及它們將隱式地用于 Java 環(huán)境的 CLASSPATH 上。


4. Java 6 允許類路徑通配符

為了避免龐大的 CLASSPATH 環(huán)境變量(Java 開發(fā)人員幾年前就應(yīng)該拋棄的)和/或命令行 -classpath 參數(shù),Java 6 引入了類路徑通配符 的概念。與其不得不啟動參數(shù)中明確列出的每個 JAR 文件,還不如自己指定 lib/*,讓所有 JAR 文件列在該目錄下(不遞歸),在類路徑中。

不幸的是,類路徑通配符不適用于之前提到的 Class-Path 屬性清單入口。但是這使得它更容易啟動 Java 應(yīng)用程序(包括服務(wù)器)開發(fā)人員任務(wù),例如 code-gen 工具或分析工具。


5. JAR 有的不只是代碼

Spring,就像許多 Java 生態(tài)系統(tǒng)一樣,依賴于一個描述構(gòu)建環(huán)境的配置文件,前面提到過,Spring 依賴于一個 app.xml 文件,此文件同 JAR 文件位于同一目錄 — 但是開發(fā)人員在復(fù)制 JAR 文件的同時忘記復(fù)制配置文件,這太常見了!

一些配置文件可用 sysadmin 進行編輯,但是其中很大一部分(例如 Hibernate 映射)都位于 sysadmin 域之外,這將導(dǎo)致部署漏洞。一個合理的解決方案是將配置文件和代碼封裝在一起 — 這是可行的,因為 JAR 從根本上來說就是一個 “喬裝的” ZIP 文件。 當(dāng)構(gòu)建一個 JAR 時,只需要在 Ant 任務(wù)或 jar 命令行包括一個配置文件即可。

JAR 也可以包含其他類型的文件,不僅僅是配置文件。例如,如果我的 SpeakEnglish 部件要訪問一個屬性文件,我可以進行如下設(shè)置,如清單 6 所示:


清單 6. 隨機響應(yīng)
            package com.tedneward.jars;            import java.util.*;            public class SpeakEnglish            implements ISpeak            {            Properties responses = new Properties();            Random random = new Random();            public String sayHello()            {            // Pick a response at random            int which = random.nextInt(5);            return responses.getProperty("response." + which);            }            }

可以將 responses.properties 放入 JAR 文件,這意味著部署 JAR 文件時至少可以少考慮一個文件。這只需要在 JAR 步驟中包含 responses.properties 文件即可。

當(dāng)您在 JAR 中存儲屬性之后,您可能想知道如何將它取回。如果所需要的數(shù)據(jù)與 JAR 文件在同一位置,正如前面的例子中提到的那樣,不需要費心找出 JAR 文件的位置,使用 JarFile 對象就可將其打開。相反,可以使用類的 ClassLoader 找到它,像在 JAR 文件中尋找 “資源” 那樣,使用 ClassLoader getResourceAsStream() 方法,如清單 7 所示:


清單 7. ClassLoader 定位資源
            package com.tedneward.jars;            import java.util.*;            public class SpeakEnglish            implements ISpeak            {            Properties responses = new Properties();            // ...            public SpeakEnglish()            {            try            {            ClassLoader myCL = SpeakEnglish.class.getClassLoader();            responses.load(            myCL.getResourceAsStream(            "com/tedneward/jars/responses.properties"));            }            catch (Exception x)            {            x.printStackTrace();            }            }            // ...            }            

您可以按照以上步驟尋找任何類型的資源:配置文件、審計文件、圖形文件,等等。幾乎任何文件類型都能被捆綁進 JAR 中,作為一個 InputStream 獲?。ㄍㄟ^ ClassLoader),并通過您喜歡的方式使用。


結(jié)束語

本文涵蓋了關(guān)于 JAR 大多數(shù)開發(fā)人員所不知道的 5 件最重要的事 — 至少基于歷史,有據(jù)可查。注意,所有的 JAR 相關(guān)技巧對于 WAR 同樣可用,一些技巧(特別是 Class-PathMain-Class 屬性)對于 WAR 來說不是那么出色,因為 servlet 環(huán)境需要全部目錄,并且要有一個預(yù)先確定的入口點,但是,總體上來看這些技巧可以使我們擺脫 “好的,開始在該目錄下復(fù)制......” 的模式,這也使得他們部署 Java 應(yīng)用程序更為簡單。

本系列的下一個主題是:關(guān)于 Java 應(yīng)用程序性能監(jiān)視您不知道的 5 件事。



下載

描述 名字 大小 下載方法
本文樣例代碼 j-5things6-src.zip 10KB HTTP


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java 6中類路徑ClassPath對通配符的支持
java中的jar
和付費網(wǎng)盤說再見,自己起個網(wǎng)盤不香嗎?| Java 開源項目
可以在線看視頻和文檔的開源網(wǎng)盤系統(tǒng)kiftd部署和使用教程
再議JAR文件
JRE擴展與jar文件
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服