2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

項(xiàng)目經(jīng)驗(yàn)二則:讀取war包中的文件及Ant使用中的OutOfMemor...

 WindySky 2009-04-03

一、war包中的文件的讀取


在開(kāi)發(fā)J2EE Web應(yīng)用時(shí),在開(kāi)發(fā)階段通常采用目錄的部署方式,而在正式運(yùn)行時(shí)通常把web應(yīng)用打包為單個(gè)的.war文件進(jìn)行方便地部署。也就是在你的應(yīng)用目錄(比如WebLogic的DefaultWebApp)下,執(zhí)行下面的命令:
  1.     jar cf0 mywebapp.war **

這樣,要部署到正式系統(tǒng)時(shí)就非常方便,只需要把這個(gè).war文件拷貝到WebLogic的applications目錄或Tomcat的webapps目錄下即可自動(dòng)進(jìn)行部署。Tomcat會(huì)對(duì)部署的.war應(yīng)用包進(jìn)行自動(dòng)監(jiān)控、解包,所以不會(huì)出現(xiàn)下面提到的問(wèn)題。而WebLogic并不會(huì)自動(dòng)解包.war,所以如果在你的應(yīng)用中,需要讀取原來(lái)應(yīng)用中的配置文件或其它資源文件時(shí),就會(huì)發(fā)現(xiàn),在解包部署時(shí),正常運(yùn)行的程序,在WebLogic中打包部署時(shí),運(yùn)行卻出錯(cuò),會(huì)報(bào)告找不到該文件。例如下面的應(yīng)用:
       |--DefaultWebApp
            |--index.jsp
            |--.....jsp
            |--WEB-INF
                 |-- web.xml
                 |-- log4j.properties  
                 |-- classes
                   ......

其中使用到了Log4J作為日志輸出工具,Log4J的配置文件log4j.propertes放在DefaultWebApp\WEB-INF目錄下。Log4J通過(guò)一個(gè)自動(dòng)加載的Servlet進(jìn)行初始化,初始化代碼如下:
  1.     ServletContext context = getServletContext();
  2.     org.apache.log4j.PropertyConfigurator.configure(context.getRealPath("/") + 
  3. "/WEB-INF/log4j.properties");

    其中,context.getRealPath("/")得到當(dāng)前Web應(yīng)用的真實(shí)根目錄,比如,如果你的WebLogic安裝在D:\bea下,在Windows下context.getRealPath("/")通常會(huì)返回:
    D:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp
在UNIX下類似:
    /bea/wlserver6.1/config/mydomain/applications/DefaultWebApp
這樣,和"/ WEB-INF /log4j.properties"拼接后,就得到了log4j.properties文件的真實(shí)路徑,Log4J通過(guò)文件IO讀取這個(gè)配置文件,完成初始化。
    現(xiàn)在一切正常!測(cè)試通過(guò)后,將DefaultWebApp下的所有文件打?yàn)橐粋€(gè).war包,進(jìn)行部署時(shí),發(fā)現(xiàn)系統(tǒng)報(bào)告找不到“D:\bea\wlserver6.1\null\ WEB-INF \log4j.properties”文件!如果你的應(yīng)用中還需要讀取其它已經(jīng)被打包到war包中的文件,都會(huì)報(bào)告找不到文件。并且,系統(tǒng)并不會(huì)到D:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp目錄下尋找,而會(huì)到D:\bea\wlserver6.1\null下尋找。這是因?yàn)閏ontext.getRealPath("/")返回了null。查看ServletContext的API文檔,

public String getRealPath(String path)
……
The real path returned will be in a form appropriate to the computer and operating system on which the servlet container is running, including the proper path separators. This method returns null if the servlet container cannot translate the virtual path to a real path for any reason (such as when the content is being made available from a .war archive).

原來(lái),對(duì)一個(gè)打包的應(yīng)用來(lái)說(shuō),是沒(méi)有RealPath的概念的,調(diào)用getRealPath只會(huì)簡(jiǎn)單地返回null。其實(shí),也很好理解,一個(gè)文件被打包入了.war文件,就不存在目錄結(jié)構(gòu)了(雖然包中仍然存在目錄結(jié)構(gòu),但這不等同于文件系統(tǒng)中的目錄結(jié)構(gòu))。所以,對(duì)war包中的資源是無(wú)法得到RealPath的。這樣也就無(wú)從通過(guò)文件IO進(jìn)行讀取了。那么,如何讀取war包中的資源呢?答案是使用ServletContext.getResourceAsStream(String)方法。
    對(duì)于org.apache.log4j.PropertyConfigurator,有如下幾種配置方法:
  1.   static void configure(Properties properties); 
  2.   static void configure(String configFilename); 
  3.   static void configure(URL configURL);

既然,現(xiàn)在不能得到war包中的Log4J的配置文件,那么可以通過(guò)讀入InputStream,構(gòu)造一個(gè)Properties,通過(guò)configure(Properties properties)方法同樣可以完成配置。示例代碼如下:
  1.         InputStream is = getServletContext().
  2.           getResourceAsStream("/WEB-INF/log4j.properties");
  3.         Properties props = new Properties();
  4.         try {
  5.             props.load(is);
  6.         } catch (IOException e) {
  7.             System.err.println("Load log4j configuration failed");
  8.         }
  9.         PropertyConfigurator.configure(props);

那么,現(xiàn)在對(duì)于war應(yīng)用可以成功運(yùn)行,但如果現(xiàn)在不通過(guò)war部署,直接通過(guò)目錄結(jié)構(gòu)部署應(yīng)用會(huì)不會(huì)又出現(xiàn)找不到資源的錯(cuò)誤呢?請(qǐng)來(lái)看看ServletContext.getResourceAsStream的API文檔,

Returns a URL to the resource that is mapped to a specified path. The path must begin with a "/" and is interpreted as relative to the current context root. 
This method allows the servlet container to make a resource available to servlets from any source. Resources can be located on a local or remote file system, in a database, or in a .war file. 

可見(jiàn),通過(guò)getResourceAsStream可以獲取包括本地文件系統(tǒng)、遠(yuǎn)程文件系統(tǒng)、war包等資源。不會(huì)出現(xiàn)上面擔(dān)心的問(wèn)題。

結(jié)論:在開(kāi)發(fā)J2EE Web應(yīng)用時(shí),如果需要讀取本應(yīng)用中的文件,盡量使用ServletContext.getResourceAsStream進(jìn)行,而不要使用文件IO。

二、Ant使用中的OutOfMemoryError解決


在開(kāi)發(fā)大型項(xiàng)目時(shí),類文件通常有數(shù)千個(gè)之多,這時(shí)都需要采用一些make工具來(lái)輔助開(kāi)發(fā)。有時(shí)需要編譯的類太多,使用Ant編譯時(shí),會(huì)出現(xiàn)OutOfMemoryError的錯(cuò)誤,使編譯進(jìn)程中斷。這時(shí),通常通過(guò)先移出部分文件,分批編譯。但Java編譯過(guò)程的自動(dòng)依賴編譯,通常很難確定究竟應(yīng)該先移出哪些文件、后移出哪些文件傷透腦筋。有沒(méi)有簡(jiǎn)便的方法?有!
轉(zhuǎn)到你的Ant的安裝目錄,在bin子目錄中找到ant.bat,使用文字編輯器打開(kāi),修改:runAnt處的允許命令,添加如下參數(shù):

:runAnt
"%_JAVACMD%" -Xms128m -Xmx512m -classpath ……

如果你安裝了Jike,使用Jike編譯器,則需要修改:runAntWithJikes處的運(yùn)行命令,同上。

結(jié)論:Java虛擬機(jī)默認(rèn)分配64M內(nèi)存,如果你的應(yīng)用比較大,超出64M內(nèi)存,Java虛擬機(jī)就會(huì)拋出OutOfMemoryError,并停止運(yùn)行。不管是什么應(yīng)用(Web應(yīng)用、Application等),只需要修改你的機(jī)器上的運(yùn)行Java命令,在java xxx命令中添加-Xms(最小使用內(nèi)存)、-Xmx(最大使用內(nèi)存)即可解決。當(dāng)然,這兒的內(nèi)存容量都是指物理內(nèi)存,不能超出你的機(jī)器的物理內(nèi)存的總?cè)萘俊?/strong>



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多