在代碼回顧中經常會看到一些特別糟糕的代碼。像其他人指出的那樣,我有時候也會寫出很糟糕的代碼。
然而在大部分情況下,這是由於開發人員沒有對問題做深入的理解:大部分人學習的知識(在大學或從高級開發人員處學習)是幾年前的。有些人僅僅是在百度搜索問題,然後粘貼找到的代碼。
這個小小的文章簡單的講解處理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);
這就是了:非常直接的使用了應用服務器提供的功能。