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

use*_*949 13 java jar

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

Bal*_*usC 13

许多Java(EE)API都有一个契约,当您将特定配置/元数据文件放在META-INF您(或第三方)JAR 的文件夹中时,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文件夹也是类路径的一部分,因此类加载器加载这些文件很容易.