日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
關(guān)于JAR您不知道的5件事

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

公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)公司推出湘橋免費(fèi)做網(wǎng)站回饋大家。

  事實(shí)上,JAR 能做的不止是存儲(chǔ)源代碼,您應(yīng)該了解 JAR 還能做什么,以及如何進(jìn)行。本文將向您展示如何***限度地利用 Java Archive 文件(有時(shí)候也可是 WAR 和 EAR),特別是在部署時(shí)。

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

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

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

  把它放在 JAR 中

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

  清單 1. 存檔控制臺(tái)實(shí)用工具

 
 
 
  1. package com.tedneward.jars;  
  2. public class Hello
  3. {
  4.     public static void main(String[] args)
  5.     {
  6.         System.out.println("Howdy!");
  7.     }
  8. }  

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

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

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

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

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

  清單 2. 展示入口點(diǎn)!

 
 
 
  1. Main-Class: com.tedneward.jars.Hello

  這個(gè)清單文件只是一個(gè)名值對(duì)。因?yàn)橛袝r(shí)候清單文件很難處理回車(chē)和空格,然而在構(gòu)建 JAR 時(shí),使用 Ant 來(lái)生成清單文件是很容易的。在清單 3 中,使用 Ant jar 任務(wù)的 manifest 元素來(lái)指定清單文件:

  清單 3. 構(gòu)建我的入口點(diǎn)!

 
 
 
  1.     
  2.         
  3.             
  4.         manifest>
  5.     jar>
  6. target>

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

#p#

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

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

 清單 4. Hello、Spring world!

 
 
 
  1. package com.tedneward.jars;  
  2. import org.springframework.context.*;
  3. import org.springframework.context.support.*;  
  4. public class Hello
  5. {
  6.     public static void main(String[] args)
  7.     {
  8.         ApplicationContext appContext =
  9.             new FileSystemXmlApplicationContext("./app.xml");
  10.         ISpeak speaker = (ISpeak) appContext.getBean("speaker");
  11.         System.out.println(speaker.sayHello());
  12.     }
  13. }

  關(guān)于 Spring 的更多信息這個(gè)技巧將幫助您熟悉依賴(lài)項(xiàng)注入和 Spring 框架。如果您需要溫習(xí)其他主題,見(jiàn) 參考資料。

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

  清單 5. Hello、Spring CLASSPATH!

 
 
 
  1.        
  2.            
  3.                
  4.                
  5.                    value="./lib/org.springframework.context-3.0.1.RELEASE-A.jar 
  6.                      ./lib/org.springframework.core-3.0.1.RELEASE-A.jar 
  7.                      ./lib/org.springframework.asm-3.0.1.RELEASE-A.jar 
  8.                      ./lib/org.springframework.beans-3.0.1.RELEASE-A.jar 
  9.                      ./lib/org.springframework.expression-3.0.1.RELEASE-A.jar 
  10.                      ./lib/commons-logging-1.0.4.jar" />
  11.            manifest>
  12.        jar>    
    • target>

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

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

#p#

  3. JAR 可以被隱式引用

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

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

#p#

  4. Java 6 允許類(lèi)路徑通配符

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

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

#p#
5. JAR 有的不只是代碼

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

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

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

清單 6. 隨機(jī)響應(yīng)

 
 
 
  1. package com.tedneward.jars;  
  2. import java.util.*;  
  3. public class SpeakEnglish
  4.     implements ISpeak
  5. {
  6.     Properties responses = new Properties();
  7.     Random random = new Random();  
  8.     public String sayHello()
  9.     {
  10.         // Pick a response at random
  11.         int which = random.nextInt(5);          
  12.         return responses.getProperty("response." + which);
  13.     }
  14. }   

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

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

  清單 7. ClassLoader 定位資源

 
 
 
  1. package com.tedneward.jars;  
  2. import java.util.*;  
  3. public class SpeakEnglish
  4.     implements ISpeak
  5. {
  6.     Properties responses = new Properties();
  7.     // ...  
  8.     public SpeakEnglish()
  9.     {
  10.         try
  11.         {
  12.             ClassLoader myCL = SpeakEnglish.class.getClassLoader();
  13.             responses.load(
  14.                 myCL.getResourceAsStream(
  15.                     "com/tedneward/jars/responses.properties"));
  16.         }
  17.         catch (Exception x)
  18.         {
  19.             x.printStackTrace();
  20.         }
  21.     }      
  22.     // ...
  23. }

  您可以按照以上步驟尋找任何類(lèi)型的資源:配置文件、審計(jì)文件、圖形文件,等等。幾乎任何文件類(lèi)型都能被捆綁進(jìn) JAR 中,作為一個(gè) InputStream 獲取(通過(guò) ClassLoader),并通過(guò)您喜歡的方式使用。

  結(jié)束語(yǔ)

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


文章題目:關(guān)于JAR您不知道的5件事
文章出自:http://www.dlmjj.cn/article/dhdipde.html