为什么有些资源文件放在META-INF目录下

时间:2011-04-10 02:02:07

标签: java jar

我想知道为什么有些资源文件放在JAR的META-INF目录下?我总是将test.properties之类的资源放在root direccory下。将它们放入META-INF有什么好处吗?

3 个答案:

答案 0 :(得分:13)

许多Java(EE)API都有一个合同,当您将特定配置/元数据文件放在您(或第三方)JAR的META-INF文件夹中时,API将自动执行API-特定作业,例如扫描类,预加载特定类和/或基于元信息执行特定代码。

标准Java SE API提供的示例是ServiceLoader。其中,JDBC 4.0兼容的驱动程序实现了这一点。这样只需删除JDBC驱动程序JAR文件文件夹就会在Java应用程序的启动/初始化期间自动加载驱动程序类,而无需在代码中添加任何手动Class.forName("com.example.Driver")行。

此外,Java EE 6还提供了JSF 2.0 API,它在应用程序启动期间扫描faces-config.xml文件夹中META-INF文件的所有JAR文件。如果存在,那么它将作为提示扫描整个JAR文件以获取实现JSF特定注释的类,如@ManagedBean,以便它们自动实例化并自动配置。这节省了在整个类路径中扫描所有JAR中数千个类的潜在昂贵工作的时间。在这些API的旧版本中,配置通常由(详细的)XML文件完成。

总而言之,主要目标是从代码和/或配置样板中保存开发人员。 JAR的META-INF文件夹用于配置文件/提示。一些API确实也将静态文件/资源​​放在那里供自己使用。 META-INF文件夹也是类路径的一部分,因此类加载器加载这些文件很容易。

答案 1 :(得分:4)

在servlet 3.0中,某些静态资源可通过Web上下文获得,例如.css,java脚本和.png文件,因此您不再需要使用ServletContext getResource()和getResourceAsStream()。有关更多信息,请查看web-fragment.xml(https://blogs.oracle.com/swchan/entry/servlet_3_0_web_fragment),它是涵盖此主题的一种资源。

就个人而言,我更喜欢按照Maven喜欢的方式构建我的项目,使用src / main / resources目录作为应用程序类路径的一部分。

答案 2 :(得分:2)

这只是一个约定,一些(大多数?)第三方罐子用来查找你提供的文件。对于您自己的类和文件,您可以选择将它们放在您喜欢的位置。

相关问题