问题标签 [serviceloader]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
422 浏览

java - Java 9 ServiceLoader 运行时模块加载和替换

我刚刚阅读了有关 Java 9 模块系统的信息,我想问一下ServiceLoader. 当应用程序已经启动时,有什么方法可以添加服务实现?删除一些服务实现怎么样?

用例:我将有一些计算某些东西的应用程序。计算算法将在某些服务(Java 9 模块)中定义。是否有任何步骤可以在不停止应用程序的情况下替换此算法?我什么时候更换罐子只是计算会失败,我需要在模块加载完成后捕获错误并重新启动?

有没有其他项目可以支持这样的用例?

0 投票
1 回答
908 浏览

java - 提供者不是 docker 容器内的子类型

情况

我正在开发一个使用 Java 的URLClassLoaderServiceLoader来加载 jar 文件的应用程序。在这些 jar 文件中是实现我的接口的提供程序。文件夹结构如oracle 在这篇文章中所述,这意味着:

  • 该接口与插件中实现该接口的类(com.x.projectname.plugin.IInterface.java)位于同一目录中。在插件中,接口和实现它的类都在com.x.projectname.plugin文件夹中。
  • 在插件中有一个resources.META-INF.services目录,其中有一个文件:com.x.projectname.plugin.IInterface,内容如下:com.x.projectname.plugin.ClassThatImplementsIInterface

在我的本地机器上运行时(使用 Oracle JDK 1.8 162 和 OpenJDK 1.8 171 测试),插件加载良好,应用程序可以根据需要使用插件。

问题

在 docker 容器中运行主应用程序时,它无法加载所需的插件。Docker 容器在机器上安装了一个文件夹,其中安装了插件。该应用程序的docker镜像使用openjdk:8-jdk-alpine,但无论我是否使用alpine版本,问题仍然存在。

尝试使用Serviceloader.load()加载插件时(参见ServiceLoader.load(InterfaceName.class, ClassLoader loader)

它崩溃并出现以下错误:Provider com.x.projectname.plugin.InterfaceImplementingClass not a subtype。

这是堆栈跟踪的相关部分:

任何想法为什么它在 Docker 容器中运行时不会加载插件?

编辑 1:Dockerfile 和 docker run 命令

码头工人运行命令:

0 投票
1 回答
477 浏览

serviceloader - java.util.ServiceLoader 是否可以在不重新启动的情况下找到添加到类路径中的新 jar?

我有一个 java 应用程序,它被实现为使用 java.util.serviceLoader 查找接口的提供者。当我在运行时将新的提供程序 jar 添加到应用程序的类路径时,应用程序找不到它。如果我重新启动应用程序,应用程序会找到提供程序 jar。java应用程序是否有任何选项可以在运行时找到提供程序jar,因为我认为这是java serviceLoader应该做的。

我正在按照此页面中的说明进行操作。 http://cr.openjdk.java.net/~mr/jigsaw/spec/api/java/util/ServiceLoader.html 在类路径上部署服务提供者

0 投票
2 回答
109 浏览

java - ServiceLoader 中的 Iterable 对象是否已排序?

我有一个非常简单的问题,但我无法找到正确的答案。

所以在我的项目中,我有一个抽象类“JmjrstPlugin”,其他一些插件从中继承。我正在使用 javas ServiceLoader 来查找所有插件类,如下所示:

对于我的问题:我从这个函数中收到的 Iterable Object 是否已排序。(JmjrstPlugin 实现了 Comparable 接口并且有一个工作的 compareTo 方法)。

PS:该项目目前处于使我无法立即对其进行测试的状态。

0 投票
1 回答
80 浏览

java - 如何从 JAR 应用程序中动态加载类以在另一个 JAR 中使用?

我有一个 JAR 应用程序 M.jar,它支持动态编写和加载扩展。应用程序要求类实现接口 E 并被称为 NE。

现在,以下是我正在尝试做的事情,

  1. 编写扩展 API1 并将其加载到 M。
  2. 编写另一个扩展 APIUser,将其加载到 M 并使用 API1。

请参阅下图了解我在这里尝试做的事情。

在此处输入图像描述

我知道 M.jar 使用自定义 ClassLoader,因为它只需要将任何扩展名命名为 AE。

我尝试了此处描述的 ServiceProvider、ServiceProviderInterface 方法,但没有奏效。我相信这是因为 API 的类不在 M 的类路径中,因此 APIUser 找不到它。

我想知道,

  1. 如果可以使用 APIUser 的 ClassLoader 加载 API 的类并初始化它以供 APIUser 使用。
  2. M 是否可以从任何其他扩展中阻止/隔离 API 的 ClassLoader?我认为它可以基于这个答案
  3. 还有什么其他方法可以在 APIUser1 或 APIUSer2 中加载 API 类......并且只维护 API 类的一个实例?(即单例)
0 投票
1 回答
111 浏览

scala - 如何注册自定义 AppHistoryServerPlugin?

如何创建自己的AppHistoryServerPlugintrait 实现并将其作为服务提供ServiceLoader给 Apache Spark?

注意:这个插件类在一个 JAR 中,它位于 Apache Spark 的类路径中。

源目录结构

org.apache.spark.status.AppHistoryServerPlugin

org.apache.spark.custom.ui.CustomScalaHistory

自定义ScalaHistoryListener

pom.xml

为了构建我的包,我运行

生成的包也包含org.apache.spark.status.AppHistoryServerPluginMETA-INF/services.

最后,我在使用 JAR 时放入了 JAR --jarsspark-submityarn-clientSpark 没有选择我的CustomScalaHistory课程。

0 投票
0 回答
538 浏览

java - 是否可以在基于 java9 模块的项目中生成带有注释处理器的服务提供者

在 java9 模块之前,有一个选项可以生成服务提供者实现类和 META-INF/services 文件。使用此选项,在注释处理期间生成的服务提供程序类可以在运行时通过 ServiceLoader 访问(如果还生成了适当的 META-INF/services 资源文件)。

在 java9(启用模块)中,引入了新的 ServiceLoader 机制。不再有 META-INF/services,所有服务和服务提供者都应该在 module-info.java 中显式声明。这是否意味着 java9(带有启用的模块)限制生成服务提供者类及其声明,还是我遗漏了什么?

谢谢。

0 投票
4 回答
735 浏览

java - 什么是 ServiceLoader,它是如何使用的?

我遇到了文档,ServiceLoader但不清楚它适合哪些用例。

什么时候使用ServiceLoader

0 投票
1 回答
201 浏览

java - 使用 ServiceLoader 获取提供多个服务的服务提供者类的相同实例

我有问题,不知道用什么方法解决

假设我有两个服务提供者接口 (SPI)

以及提供两种服务的服务提供商,即

问题是,当我尝试通过ServiceLoader.load(Logger.class)它获取日志服务的实例时,它与使用创建的实例不同ServiceLoader.load(View.class)。有没有办法让我可以从两个调用中获得相同的对象实例?

这个想法是,在将视图加载为 GUI 之后,我希望能够登录同一个 GUI 实例,而不是另一个。就目前而言,我被两个单独的实例困住了,所以日志确实出现了。

0 投票
0 回答
1180 浏览

java - Java - ServiceLoader - Intellij 找不到实现类文件

介绍

我正在尝试创建多个对输入进行模糊测试的服务(出于测试目的。我正在使用依赖注入的概念java.util.ServiceLoader<T>。我在这个项目中使用 IntelliJ。

Github 项目链接:https ://github.com/ghoshabhi/java-service-loader

问题

我创建了一个META-INF/services目录,其中包含一个文件:htmlfuzzing.spi.HtmlFuzzer提及我的实现类 ( htmlfuzzing.TagReplacer) 的路径。我试图创建一个类似于Oracle 网站上的示例的结构。

我还继续将META-INF目录标记resourcesProject Settings > Modules

在此处输入图像描述

这是我的output目录的样子:

在此处输入图像描述

正如您在上面看到的,实现类的类文件没有添加到out/目录中。

这是我的完整目录结构:

在此处输入图像描述

问题

我显然在这里做错了什么,但我无法理解是什么。META-INF将目录添加或标记为resources的正确方法是什么,或者包含所有服务实现类的正确方法是什么?

任何有关解决此问题的帮助或提示表示赞赏。

编辑 - 1

添加src/resource文件夹并将META-INF目录放在其中。但是我仍然没有在out目录中看到实现类的类文件。

此外,我注意到的一件事是,一旦我将任何目录标记为resource项目结构中的目录 - 它就会从左侧的项目视图中消失。有什么奇怪的地方吗?

在此处输入图像描述