当前位置: 首页 > 知识库问答 >
问题:

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

赵鸿畴
2023-03-14

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

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

共有3个答案

锺离辰沛
2023-03-14

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

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

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

您可以使用它通过添加多个来指定多个目录

佟英武
2023-03-14

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

src/main/resources

所以把它放在

src/main/resources/META-INF/services
仇迪
2023-03-14

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

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

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

com.example.MyInterfaceImpl
com.example.AnotherMyInterfaceImpl

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

执行此操作后,您可以使用ServiceLoader加载接口的所有实现:

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());
}

一些需要注意的事项:

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

如果这些条件对您不起作用,那么您可能希望切换到另一个系统,例如Spring,EJB等CDI样式的框架。

 类似资料:
  • 问题内容: 我正在使用Eclipse构建Java项目,该项目是使用Maven构建的。我使用的是旧项目中的一些再生代码,这些类之一在JAR文件夹中查找具有特定名称的文件,然后解析该文件的文本。在此特定示例中,它将查找具有Java接口名称的文件,然后从文件内部获取实现的类名称。 因此,基本上我想做的是 在JAR的“ META-INF / services”文件夹中包含一个文件名(X)和一行文本(Y)的

  • 我正在Eclipse中处理一个Java项目,该项目是使用Maven构建的。我使用的是一个旧项目中的一些循环代码,其中一个类在JAR的文件夹中查找一个具有特定名称的文件,然后解析该文件的文本。在这个特定的示例中,它查找一个具有Java接口名称的文件,然后从文件内部获取实现的类名。

  • 我正在使用 Maven 来构建一个 Java 项目,我有几个文件,和,我想将它们复制到 JAR 文件内的 目录中。 到目前为止,我的工作如下: 但这也会在编译时将这两个文件复制到 目录中。 所以我希望这些文件包含在JAR文件中,而不是其他地方。有办法做到这一点吗?

  • 我正在为SAP hana云平台开发一个需要UnlimitedJCEPolicyJDK8的实现。文档告诉我需要将其置于以下结构下: WAR文件:meta-inf-ext_security-jre8 问题是,当我包含JAR时,它会转到WEB-INF/类,而服务器并不在这方面。如图所示。 尝试了以下操作: 使用eclipse web部署程序集添加文件(无论出于什么原因,它似乎不能与maven一起工作,是

  • 有没有一种方法可以用Maven在Meta-INF/services中创建自定义服务文件?这就是您使用Ant的方法:https://ant.apache.org/manual/tasks/jar.html 我知道在我的源代码中创建一个resources/meta-inf/并放置我想要的任何服务文件是可能的。然后,Maven会自动将这些文件拉到我的JAR中。这不能解决我的问题。 在我的源代码中有多个版

  • 我想将文件从我的>移到>文件夹。我尝试使用插件,但它只是将文件从复制到文件夹中的。但是在构建的中,文件在中不可用 我如何将我的启动文件移动到META-INF到ear>META-INF? 这是EAR的pom文件。 下面是project workspace屏幕抓取