java - 如何使用 Maven 在 JAR 的 "META-INF/services"文件夹中包含配置文件

标签 java eclipse maven pom.xml

我正在 Eclipse 中开发一个使用 Maven 构建的 Java 项目。我正在使用旧项目中的一些回收代码,其中一个类在 JAR 的 META-INF/services 文件夹中查找具有特定名称的文件,然后解析此文本文件。在这个特定的示例中,它会查找具有 Java 接口(interface)名称的文件,然后从文件中获取实现的类名。

所以基本上我要做的是在 JAR 的“META-INF/services”文件夹中包含一个文件,文件名 (X) 和一行文本 (Y)。我猜这应该使用 Maven 来完成,也许是通过在 POM 文件中指定一个属性,但我的研究没有发现任何东西。我知道您不应该硬编码或手动输入任何 META 文件,所以我不知道该怎么做。

最佳答案

Create a new source folder使用位置 src/main/resources,然后在其中创建您的 META-INF/services 文件夹并放入您的完全限定类名 (FQCN) 文件。这应该会自动将它们复制到 jar 文件中。因此,对于具有 com.acme.MyInterface 的 FQCN 的接口(interface)的实现,您将拥有:

Project
| src
| | main
|   | java
|     | [your source code]
|   | resources
|     | META-INF
|       | services
|         | com.acme.MyInterface

请注意,com.acme.MyInterface 是文件名,而不是像 Java 包这样的目录结构。该文件的名称是您正在实现的接口(interface)的 FQCN,在其中,您将在自己的行中拥有每个实现的 FQCN,例如:

com.example.MyInterfaceImpl
com.example.AnotherMyInterfaceImpl

值得注意的是,这也适用于具有默认源集的 Gradle 项目。

完成此操作后,您可以使用 ServiceLoader 加载接口(interface)的所有实现:

ServiceLoader<MyInterface> loader = ServiceLoader.load(MyInterface.class);
for (MyInterface service : loader) {
    // Prints com.example.MyInterfaceImpl and com.example.AnotherMyInterfaceImpl
    System.out.println(service.class.getName());
}

注意事项:

  • 所有实现都必须有一个无参数构造函数
  • 使用模块或自定义类加载器的应用程序可能必须使用 ServiceLoader.load
  • 的重载

如果这些条件不适合您,那么您可能需要切换到另一个系统,例如一个 CDI 风格的框架,如 Spring、EJB 等。

关于java - 如何使用 Maven 在 JAR 的 "META-INF/services"文件夹中包含配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17531625/

相关文章:

Java - 打印出数组中出现次数最少的元素

java - java二维数组中的代码位置

java - Dagger 2重新初始化单例

java - org.eclipse.core.runtime.CoreException : The class file is not on the classpath

java - Uber jar 不读取外部属性文件

android - Gradle 构建过程失败

java - 如何将第三方Java库编译成我可以使用的jar文件?

java - BIRT 报告,您将如何创建贴纸?

java - 运行时 Google map View 错误 - Droid

eclipse - Maven 为 Eclipse 中嵌入的 Tomcat 过滤 web.xml