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

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

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

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

在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目录,该目录是应用程序类路径的一部分。

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