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


76

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

因此,基本上我想做的是在JAR的“ META-INF / services”文件夹中包含一个文件,文件名(X)和一行文本(Y)。我猜测应该使用Maven来完成此操作,也许可以通过在POM文件中指定一个属性来实现,但是我的研究尚未发现任何问题。我知道您不应该硬编码或手动键入任何META文件,所以我不确定在这里做什么。

Answers:


124

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

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

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


1
在服务文件夹中放什么?
奥赞·库尔特

2
@OzanKurt请查看ServiceLoader类的Javadoc:docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html
Puce

2
@OzanKurt这是相关的Java跟踪。简而言之,文件META-INF / services中的名称将类似于META-INF / services / com.acme.MyInterface,它将包含应用程序中每个实现的FQCN,每行都包含一个新行,例如com.example.MyInterfaceImpl
Brian

谢谢@布莱恩!那对我很有帮助!
andrbmgi

20

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

src/main/resources

所以放在

src/main/resources/META-INF/services

1
在服务文件夹中放什么?
奥赞·库尔特

16

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

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

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

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


在服务文件夹中放什么?
奥赞·库尔特

@OzanKurt我不确定其中包含的所有内容,但是通常位于META-INF / services中的文件示例之一是自定义CharsetProvider。
罗伯特·巴特利特·施耐德

1
我明白了,需要添加注释。谢谢
Ozan Kurt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.