java meta-inf作用_java - META-INF的目的是什么?

在Java中,META-INF文件夹包含元文件,用于配置应用程序、扩展和类加载器。例如,MANIFEST.MF文件定义JAR的内容和主类,services/目录用于服务提供者,签名文件用于验证JAR的完整性。开发者不应随意放入文件,而是应依赖打包工具来管理这个目录。
摘要由CSDN通过智能技术生成

java - META-INF的目的是什么?

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

Kristian asked 2019-02-09T12:29:24Z

12个解决方案

150 votes

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

META-INF目录

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

services/

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

services/

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

services/

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

services/

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

services/

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

aku answered 2019-02-09T12:31:35Z

59 votes

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

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

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

Daniel Spiewak answered 2019-02-09T12:29:59Z

24 votes

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

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

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

user38748 answered 2019-02-09T12:32:17Z

8 votes

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

例如:

META-INF/resources/button.jpg

并通过它在web3.0容器中获取它们

http://localhost/myapp/button.jpg

> 阅读更多

/ META-INF/MANIFEST.MF有一个特殊含义:

如果您使用java.lang.Package.getPackage("org.myserver").getImplementationTitle()运行jar,则可以将主类定义移动到jar中,以便将调用缩小为java -jar myjar.jar。

如果使用java.lang.Package.getPackage("org.myserver").getImplementationTitle(),则可以将Metainformation定义为包。

您可以参考您希望在Applet / Webstart模式下使用的数字证书。

Peter Rader answered 2019-02-09T12:33:32Z

8 votes

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

Brian Matthews answered 2019-02-09T12:34:00Z

4 votes

只是为了添加这里的信息,在WAR文件的情况下,META-INF / MANIFEST.MF文件为开发人员提供了一个工具来启动容器的部署时检查,确保容器可以找到应用程序的所有类。 依赖于取决于。 这可以确保在您错过JAR的情况下,您不必等到应用程序在运行时爆炸才能意识到它已丢失。

sasuke answered 2019-02-09T12:34:28Z

3 votes

我最近一直在考虑这个问题。 对META-INF的使用似乎没有任何限制。 当然,对于将清单放在那里的必要性存在某些限制,但似乎没有任何关于将其他东西放在那里的禁令。

为什么会这样?

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

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

但实际上似乎没有任何标准,任何你都不会。 通常这些东西都是非常严格定义的,但由于某种原因,似乎这里没有标准。 奇。 似乎META-INF已经成为任何所需配置的一个繁琐的地方,这些配置无法通过其他方式轻松处理。

Steve Cohen answered 2019-02-09T12:35:36Z

3 votes

如果您正在使用JPA1,则可能必须在其中删除persistence.xml文件,该文件指定您可能要使用的持久性单元的名称。 持久性单元提供了一种方便的方法来指定一组元数据文件,以及包含要在分组中保留的所有类的类和jar。

import javax.persistence.EntityManagerFactory;

import javax.persistence.Persistence;

// ...

EntityManagerFactory emf =

Persistence.createEntityManagerFactory(persistenceUnitName);

在这里查看更多:[http://www.datanucleus.org/products/datanucleus/jpa/emf.html]

f0ster answered 2019-02-09T12:36:15Z

3 votes

Maven中的META-INF

在Maven中,可以理解META-INF文件夹,因为标准目录布局按名称约定将项目资源打包到JAR中:放置在$ {basedir} / src / main / resources目录中的任何目录或文件都打包到JAR中 从JAR底部开始的完全相同的结构。 Folder $ {basedir} / src / main / resources / META-INF通常包含.properties文件,而jar中包含生成的MANIFEST.MF,pom.properties,pom.xml以及其他文件。 像Spring这样的框架使用classpath:/META-INF/resources/来提供Web资源。 有关更多信息,请参阅如何向Maven项目添加资源

EliuX answered 2019-02-09T12:37:52Z

3 votes

添加到此处的信息,META-INF是一个特殊的文件夹,getSystemResources处理与jar中的其他文件夹不同。嵌套在META-INF文件夹中的元素不会与其外部的元素混合。

把它想象成另一个根。 从getSystemResources方法等方面来看:

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

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

如果您知道getSystemResources方法专门处理的另一个文件夹名称,请对其进行评论。

Readren answered 2019-02-09T12:38:58Z

1 votes

所有答案都是正确的。 Meta-inf有很多用途。 另外,这里有一个关于使用tomcat容器的例子。

去Tomcat Doc并检查“标准实施> copyXML”属性。

描述如下。

如果希望在部署应用程序时将应用程序内部嵌入的上下文XML描述符(位于/META-INF/context.xml)复制到拥有主机的xmlBase,则设置为true。 在后续启动时,复制的上下文XML描述符将优先于嵌入在应用程序内的任何上下文XML描述符,即使嵌入在应用程序内的描述符更新。 标志的值默认为false。 请注意,如果拥有主机的deployXML属性为false,或者拥有主机的copyXML属性为true,则此属性将不起作用。

Tugrul answered 2019-02-09T12:39:56Z

0 votes

您的META-INF文件夹中有MANIFEST.MF文件。 您可以定义必须具有访问权限的可选或外部依赖项。

例:

考虑你已经部署了你的应用程序和你的容器(在运行时)发现你的应用程序需要一个不在lib文件夹中的新版本的库,在这种情况下如果你在Source:中定义了可选的较新版本,那么你的应用程序将 从那里引用依赖(并且不会崩溃)。

Source: Head First Jsp&Servlet的

Prateek Joshi answered 2019-02-09T12:40:39Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值