處理webapp中的MANIFEST.MF(轉)

在代碼回顧中經常會看到一些特別糟糕的代碼。像其他人指出的那樣,我有時候也會寫出很糟糕的代碼。

然而在大部分情況下,這是由於開發人員沒有對問題做深入的理解:大部分人學習的知識(在大學或從高級開發人員處學習)是幾年前的。有些人僅僅是在百度搜索問題,然後粘貼找到的代碼。

這個小小的文章簡單的講解處理web應用上下文的manifest文件的正確方式。這看上去很簡單,但是有很多種方式來實現它,到現在爲止我發現只有一個正確的方法。

作爲開始,一個非常不好的處理它的方式將是如此:

 

InputStream inputStream= getClass().getClassLoader().getResourceAsStream("/META-INF/MANIFEST.MF"); 

Manifest manifest = new Manifest(inputStream);

爲什麼不好?因此,基於你的類加載器策略,你可能會獲取到另外一個manifest,可能完全和web應用無關:例如,上述代碼片段可能獲取到EAR的manifest,當使用默認類加載器策略時(父優先Parent-First)。

另一個錯誤的代碼將是如下,基於相同的原因:

URL url = getClass().getProtectionDomain().getCodeSource().getLocation();

InputStream inputStream= url.openStream();Manifest manifest = new Manifest(inputStream);

最後,一個人可能嘗試獲取war中的manifest文件,但是他忽略了WAR將被包裝爲EAR文件或以解包的方式進行部署。

我認爲唯一的方式是通過應用服務器提供的API來執行:

ServletContext application = getServletConfig().getServletContext();

InputStream inputStream= application.getResourceAsStream("/META-INF/MANIFEST.MF"); 

Manifest manifest = new Manifest(inputStream);

這就是了:非常直接的使用了應用服務器提供的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章