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


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

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

提前致谢。


52
2017-07-08 16:32


起源




答案:


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

Project
| src
| | main
|   | java
|     | [your source code]
|   | resources
|     | META-INF
|       | services
|         | [your service files]

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


81
2017-07-08 16:38



谢谢先生,在Maven干净安装并修复我遇到的依赖问题之后,这就行了! - Matt Vukas
什么放在服务文件夹? - Ozan Kurt
@OzanKurt请查看ServiceLoader类的Javadoc: docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html - Puce
@OzanKurt 这是相关的Java跟踪。简而言之,META-INF / services中的文件名称将类似于META-INF / services / com.acme.MyInterface,它将包含应用程序中每个FQCN的实现,每个FQCN都在一个新行上,例如: com.example.MyInterfaceImpl - Brian
@Brian非常感谢。 - Ozan Kurt


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

src/main/resources

所以把它放在

src/main/resources/META-INF/services

16
2017-07-08 16:38



什么放在服务文件夹? - Ozan Kurt


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

例如,如果你的 META-INF/services 位于名为的文件夹中 resources 它位于项目目录的根目录中,可以按如下方式指定:

<project>
...
  <build>
    ...
    <resources>
      <resource>
        <directory>resources</directory>
      </resource>
    </resources>
    ...
  </build>
  ...
</project>

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


12
2017-08-01 22:59



什么放在服务文件夹? - Ozan Kurt
@OzanKurt我不确定那里的所有内容,但是生活在META-INF /服务中的文件的一个例子通常是自定义的CharsetProvider。 - Robert Bartlett-Schneider
我得到了这个,需要添加注释。谢谢 - Ozan Kurt
这应该被选为答案:) - weima