做過JAVA EE開發的工程師應該都知道在JAVA build出來的JAR或者WAR的頂層目錄下有個META-INF文件夾吧,可是有多少人能夠清楚說出這個文件夾到底是做神馬的? What is the purpose of META-INF? 恐怕不是都能說的清楚准確吧。
把這個問題拋出來,是因為我在公司的項目中發現META-INF這個文件夾被誤用了,看來不是每個人都清楚:)
所謂META-INF, 說白了就是存放一些meta information相關的文件的這么一個文件夾, 一般來說盡量不要自己手工放置文件到這個文件夾。怎么理解這句話呢?就是說這個文件夾應該被看作是JAVA工程的一個內部META目錄,所以這個目錄下的文件應該都是build工具來生成的。我們自己的文件應該直接放到根目錄下或者其他的子目錄中。
根據官方的JAR file specification(http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html), 一個典型的META-INF目錄下可能包含如下幾種文件或者子目錄:
- MANIFEST.MF
- INDEX.LIST
- x.SF
- x.DSA
- services/
不過理想和現實總是有差距,現在即使一些著名的開源代碼對META-INF的使用上都存在大的差異,類似Apache CXF中就有這樣的Spring配置:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schema/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> ... </beans>