当前位置:  开发笔记 > 编程语言 > 正文

META-INF的目的是什么?

如何解决《META-INF的目的是什么?》经验,为你挑选了9个好方法。

在Java中,您经常会看到包含一些元文件的META-INF文件夹.这个文件夹的目的是什么,我可以放在那里?



1> aku..:

从官方的JAR文件规范(链接转到Java 7版本,但文本至少从v1.3开始没有改变):

META-INF目录

Java 2平台可识别和解释META-INF目录中的以下文件/目录,以配置应用程序,扩展,类加载器和服务:

MANIFEST.MF

清单文件,用于定义扩展和包相关的数据.

INDEX.LIST

此文件由-ijar工具的新" "选项生成,该选项包含应用程序或扩展中定义的包的位置信息.它是JarIndex实现的一部分,并由类加载器用于加速其类加载过程.

x.SF

JAR文件的签名文件.'x'代表基本文件名.

x.DSA

与签名文件关联的签名块文件具有相同的基本文件名.该文件存储相应签名文件的数字签名.

services/

此目录存储所有服务提供程序配置文件.


TLD也必须属于META-INF.

2> Daniel Spiew..:

一般来说,你不应该自己把任何东西放到META-INF中.相反,你应该依靠你用来打包JAR的任何东西.这是我认为Ant非常擅长的领域之一:指定JAR文件清单属性.说起来很容易:


    
        
    

至少,我觉得这很容易...... :-)

关键是META-INF应该被视为内部Java 目录.别乱吧!您希望包含在JAR中的任何文件都应放在其他子目录中或JAR本身的根目录中.


服务怎么样?标签库描述符?把东西放在JAR的根部是个坏主意.在没有明确约定的情况下,根中的资源很可能会发生冲突.
如果您正在使用JPA,那么您必须将persistence.xml放入该文件夹中,这是不会自动发生的.
这是一个很好的答案,除了在一个简单的Spring MVC应用程序中,META-INF是唯一可以由单元测试和控制器引用配置文件的目录.如果另一个目录工作得很好 - 它不会(至少不是直截了当).对我来说,构建一个Jar文件只是为了测试一个战争档案就像建造一辆汽车,这样你就可以走到厨房.至少对我而言.但我花了一些时间做Ruby,他们可能已经破坏了我的配置文件(尽管我会交换一点XML地狱知道我的参数类型是什么).:)
这不能回答META-INF是什么。如果我对此有一个答案,那么也许我可以自己判断是否应该“绝对不要”在该文件夹中放置某些东西。

3> 小智..:

我注意到一些Java库已经开始使用META-INF作为一个目录,其中包含应该打包并包含在CLASSPATH中的配置文件以及JAR.例如,Spring允许您使用以下方法导入类路径上的XML文件:



在这个例子中,我直接引用了Apache CXF用户指南.在我工作的项目中,我们必须通过Spring允许多级配置,我们遵循这个约定并将我们的配置文件放在META-INF中.

当我反思这个决定时,我不知道将配置文件包含在特定Java包中而不是META-INF中究竟会出现什么问题.但它似乎是一个新兴的事实上的标准; 无论是那个,还是一个新兴的反模式:-)


我不同意配置不属于库的声明.我认为配置,特别是在默认情况下,可以很好地打包在库中.我真的很高兴更多的框架选择像这样工作,而不是强迫你包括各种外部配置文件,就像不久前常见的那样.
Configuraton不属于库.我认为你用"新兴的反模式"来钉它.找到相对于库的配置文件非常容易; 他们不需要在同一个JAR中找到它.

4> Brian Matthe..:

META-INF文件夹是MANIFEST.MF文件的主页.此文件包含有关JAR内容的元数据.例如,有一个名为Main-Class的条目,它指定具有可执行JAR文件的静态main()的Java类的名称.



5> Peter Rader..:

您还可以在其中放置静态资源.

例如:

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模式下使用的数字证书.



6> sasuke..:

仅在此处添加信息,如果是WAR文件,则META-INF / MANIFEST.MF文件为开发人员提供了一种通过容器启动部署时间检查的功能,以确保容器可以找到您的应用程序的所有类。依赖于取决于。这样可以确保在错过JAR的情况下,您不必等到应用程序在运行时崩溃就知道它丢失了。



7> Steve Cohen..:

我最近一直在考虑这个问题。使用META-INF似乎没有任何限制。当然,对于将清单放在其中的必要性有一些限制,但是似乎没有任何禁止在其中放入其他内容的禁止。

为什么会这样呢?

cxf案件可能是合法的。在另一个地方,建议使用这种非标准的方法来解决JBoss-ws中的一个讨厌的错误,该错误会阻止针对wsdl模式的服务器端验证。

http://community.jboss.org/message/570377#570377

但是,实际上似乎没有任何标准,没有任何提示。通常,这些东西的定义非常严格,但是由于某种原因,似乎这里没有标准。奇。似乎META-INF已成为无法通过其他方式轻松处理的所有所需配置的统筹兼顾的地方。



8> EliuX..:

Maven中的META-INF

在Maven中,理解META-INF文件夹的原因是“ 标准目录布局”,它按照名称约定将您的项目资源打包在JAR中:放置在$ {basedir} / src / main / resources目录中的任何目录或文件都打包到JAR中从JAR的基础开始具有完全相同的结构。文件夹$ {basedir} / src / main / resources / META-INF通常包含.properties文件,而jar中的文件包含生成的MANIFEST.MFpom.propertiespom.xml等文件。像Spring这样的框架也可以classpath:/META-INF/resources/用来提供Web资源。有关更多信息,请参见如何向我的Maven项目添加资源。



9> Readren..:

除了此处的信息外,META-INF是一个特殊的文件ClassLoader夹,与jar中的其他文件夹区别对待。嵌套在META-INF文件夹内的元素不会与它外部的元素混合。

认为它像另一个根。从Enumerator ClassLoader#getSystemResources(String path)方法等角度来看:

当给定路径以“ META-INF”开头时,该方法将搜索嵌套在类路径中所有jar的META-INF文件夹内的资源。

当给定路径不是以“ META-INF”开头时,该方法将在类路径中所有jar和目录的所有其他文件夹中(META-INF之外)搜索资源。

如果您知道该getSystemResources方法特别对待的另一个文件夹名称,请对此进行评论。

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有