在Java中,您经常会看到包含一些元文件的META-INF文件夹.这个文件夹的目的是什么,我可以放在那里?
从官方的JAR文件规范(链接转到Java 7版本,但文本至少从v1.3开始没有改变):
META-INF目录
Java 2平台可识别和解释META-INF目录中的以下文件/目录,以配置应用程序,扩展,类加载器和服务:
MANIFEST.MF
清单文件,用于定义扩展和包相关的数据.
INDEX.LIST
此文件由
-i
jar工具的新" "选项生成,该选项包含应用程序或扩展中定义的包的位置信息.它是JarIndex实现的一部分,并由类加载器用于加速其类加载过程.
x.SF
JAR文件的签名文件.'x'代表基本文件名.
x.DSA
与签名文件关联的签名块文件具有相同的基本文件名.该文件存储相应签名文件的数字签名.
services/
此目录存储所有服务提供程序配置文件.
一般来说,你不应该自己把任何东西放到META-INF中.相反,你应该依靠你用来打包JAR的任何东西.这是我认为Ant非常擅长的领域之一:指定JAR文件清单属性.说起来很容易:
至少,我觉得这很容易...... :-)
关键是META-INF应该被视为内部Java 元目录.别乱吧!您希望包含在JAR中的任何文件都应放在其他子目录中或JAR本身的根目录中.
我注意到一些Java库已经开始使用META-INF作为一个目录,其中包含应该打包并包含在CLASSPATH中的配置文件以及JAR.例如,Spring允许您使用以下方法导入类路径上的XML文件:
在这个例子中,我直接引用了Apache CXF用户指南.在我工作的项目中,我们必须通过Spring允许多级配置,我们遵循这个约定并将我们的配置文件放在META-INF中.
当我反思这个决定时,我不知道将配置文件包含在特定Java包中而不是META-INF中究竟会出现什么问题.但它似乎是一个新兴的事实上的标准; 无论是那个,还是一个新兴的反模式:-)
META-INF文件夹是MANIFEST.MF文件的主页.此文件包含有关JAR内容的元数据.例如,有一个名为Main-Class的条目,它指定具有可执行JAR文件的静态main()的Java类的名称.
您还可以在其中放置静态资源.
例如:
META-INF/resources/button.jpg
并通过它在web3.0容器中获取它们
http://localhost/myapp/button.jpg
>阅读更多
/ META-INF/MANIFEST.MF有一个特殊含义:
如果使用jar运行jar java -jar myjar.jar org.myserver.MyMainClass
,可以将主类定义移动到jar中,这样就可以将调用缩小到java -jar myjar.jar
.
如果使用,可以将Metainformation定义为包java.lang.Package.getPackage("org.myserver").getImplementationTitle()
.
您可以参考您希望在Applet/Webstart模式下使用的数字证书.
仅在此处添加信息,如果是WAR文件,则META-INF / MANIFEST.MF文件为开发人员提供了一种通过容器启动部署时间检查的功能,以确保容器可以找到您的应用程序的所有类。依赖于取决于。这样可以确保在错过JAR的情况下,您不必等到应用程序在运行时崩溃就知道它丢失了。
我最近一直在考虑这个问题。使用META-INF似乎没有任何限制。当然,对于将清单放在其中的必要性有一些限制,但是似乎没有任何禁止在其中放入其他内容的禁止。
为什么会这样呢?
cxf案件可能是合法的。在另一个地方,建议使用这种非标准的方法来解决JBoss-ws中的一个讨厌的错误,该错误会阻止针对wsdl模式的服务器端验证。
http://community.jboss.org/message/570377#570377
但是,实际上似乎没有任何标准,没有任何提示。通常,这些东西的定义非常严格,但是由于某种原因,似乎这里没有标准。奇。似乎META-INF已成为无法通过其他方式轻松处理的所有所需配置的统筹兼顾的地方。
在Maven中,理解META-INF文件夹的原因是“ 标准目录布局”,它按照名称约定将您的项目资源打包在JAR中:放置在$ {basedir} / src / main / resources目录中的任何目录或文件都打包到JAR中从JAR的基础开始具有完全相同的结构。文件夹$ {basedir} / src / main / resources / META-INF通常包含.properties文件,而jar中的文件包含生成的MANIFEST.MF,pom.properties, pom.xml等文件。像Spring这样的框架也可以classpath:/META-INF/resources/
用来提供Web资源。有关更多信息,请参见如何向我的Maven项目添加资源。
除了此处的信息外,META-INF是一个特殊的文件ClassLoader
夹,与jar中的其他文件夹区别对待。嵌套在META-INF文件夹内的元素不会与它外部的元素混合。
认为它像另一个根。从Enumerator
方法等角度来看:
当给定路径以“ META-INF”开头时,该方法将搜索嵌套在类路径中所有jar的META-INF文件夹内的资源。
当给定路径不是以“ META-INF”开头时,该方法将在类路径中所有jar和目录的所有其他文件夹中(META-INF之外)搜索资源。
如果您知道该getSystemResources
方法特别对待的另一个文件夹名称,请对此进行评论。