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

Mat*_*kas 66 java eclipse pom.xml maven

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

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

提前致谢.

Bri*_*ian 107

使用该位置创建一个新的源文件夹src/main/resources,然后META-INF/services在其中创建您的文件夹并放入您的FQCN文件.这应该自动将它们复制到jar文件中.所以你会有:

Project
| src
| | main
|   | java
|     | [your source code]
|   | resources
|     | META-INF
|       | services
|         | [your service files]
Run Code Online (Sandbox Code Playgroud)

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

  • @OzanKurt请查看ServiceLoader类的Javadoc:http://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html (2认同)
  • @OzanKurt [这是相关的Java跟踪](https://docs.oracle.com/javase/tutorial/ext/basics/spi.html#register-service-providers).简而言之,META-INF/services中的文件名称将类似于META-INF/services/com.acme.MyInterface,它将包含应用程序中每个FQCN的实现,每个FQCN都在一个新行上,例如`com. example.MyInterfaceImpl` (2认同)

Puc*_*uce 18

默认情况下,Maven在以下位置查找资源:

src/main/resources
Run Code Online (Sandbox Code Playgroud)

所以把它放在

src/main/resources/META-INF/services
Run Code Online (Sandbox Code Playgroud)

  • services文件夹里要放什么? (4认同)

Rob*_*der 14

或者,如果您的项目不使用标准目录结构(或者您只是希望拥有备用资源目录),则可以手动指定POM文件的资源目录.

例如,如果您META-INF/services所在的文件夹resources位于项目目录的根目录中,则可以按如下方式指定:

<project>
...
  <build>
    ...
    <resources>
      <resource>
        <directory>resources</directory>
      </resource>
    </resources>
    ...
  </build>
  ...
</project>
Run Code Online (Sandbox Code Playgroud)

您可以使用它通过添加多个<resource>元素来指定多个目录.