问题标签 [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.
java - Java 9 ServiceLoader 运行时模块加载和替换
我刚刚阅读了有关 Java 9 模块系统的信息,我想问一下ServiceLoader
. 当应用程序已经启动时,有什么方法可以添加服务实现?删除一些服务实现怎么样?
用例:我将有一些计算某些东西的应用程序。计算算法将在某些服务(Java 9 模块)中定义。是否有任何步骤可以在不停止应用程序的情况下替换此算法?我什么时候更换罐子只是计算会失败,我需要在模块加载完成后捕获错误并重新启动?
有没有其他项目可以支持这样的用例?
java - 提供者不是 docker 容器内的子类型
情况
我正在开发一个使用 Java 的URLClassLoader和ServiceLoader来加载 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 命令
码头工人运行命令:
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 在类路径上部署服务提供者
java - ServiceLoader 中的 Iterable 对象是否已排序?
我有一个非常简单的问题,但我无法找到正确的答案。
所以在我的项目中,我有一个抽象类“JmjrstPlugin”,其他一些插件从中继承。我正在使用 javas ServiceLoader 来查找所有插件类,如下所示:
对于我的问题:我从这个函数中收到的 Iterable Object 是否已排序。(JmjrstPlugin 实现了 Comparable 接口并且有一个工作的 compareTo 方法)。
PS:该项目目前处于使我无法立即对其进行测试的状态。
java - 如何从 JAR 应用程序中动态加载类以在另一个 JAR 中使用?
我有一个 JAR 应用程序 M.jar,它支持动态编写和加载扩展。应用程序要求类实现接口 E 并被称为 NE。
现在,以下是我正在尝试做的事情,
- 编写扩展 API1 并将其加载到 M。
- 编写另一个扩展 APIUser,将其加载到 M 并使用 API1。
请参阅下图了解我在这里尝试做的事情。
我知道 M.jar 使用自定义 ClassLoader,因为它只需要将任何扩展名命名为 AE。
我尝试了此处描述的 ServiceProvider、ServiceProviderInterface 方法,但没有奏效。我相信这是因为 API 的类不在 M 的类路径中,因此 APIUser 找不到它。
我想知道,
- 如果可以使用 APIUser 的 ClassLoader 加载 API 的类并初始化它以供 APIUser 使用。
- M 是否可以从任何其他扩展中阻止/隔离 API 的 ClassLoader?我认为它可以基于这个答案。
- 还有什么其他方法可以在 APIUser1 或 APIUSer2 中加载 API 类......并且只维护 API 类的一个实例?(即单例)
scala - 如何注册自定义 AppHistoryServerPlugin?
如何创建自己的AppHistoryServerPlugin
trait 实现并将其作为服务提供ServiceLoader
给 Apache Spark?
注意:这个插件类在一个 JAR 中,它位于 Apache Spark 的类路径中。
源目录结构
org.apache.spark.status.AppHistoryServerPlugin
org.apache.spark.custom.ui.CustomScalaHistory
自定义ScalaHistoryListener
pom.xml
为了构建我的包,我运行
生成的包也包含org.apache.spark.status.AppHistoryServerPlugin
在META-INF/services
.
最后,我在使用 JAR 时放入了 JAR --jars
,spark-submit
但yarn-client
Spark 没有选择我的CustomScalaHistory
课程。
java - 是否可以在基于 java9 模块的项目中生成带有注释处理器的服务提供者
在 java9 模块之前,有一个选项可以生成服务提供者实现类和 META-INF/services 文件。使用此选项,在注释处理期间生成的服务提供程序类可以在运行时通过 ServiceLoader 访问(如果还生成了适当的 META-INF/services 资源文件)。
在 java9(启用模块)中,引入了新的 ServiceLoader 机制。不再有 META-INF/services,所有服务和服务提供者都应该在 module-info.java 中显式声明。这是否意味着 java9(带有启用的模块)限制生成服务提供者类及其声明,还是我遗漏了什么?
谢谢。
java - 什么是 ServiceLoader,它是如何使用的?
我遇到了文档,ServiceLoader
但不清楚它适合哪些用例。
什么时候使用ServiceLoader
?
java - 使用 ServiceLoader 获取提供多个服务的服务提供者类的相同实例
我有问题,不知道用什么方法解决
假设我有两个服务提供者接口 (SPI)
以及提供两种服务的服务提供商,即
问题是,当我尝试通过ServiceLoader.load(Logger.class)
它获取日志服务的实例时,它与使用创建的实例不同ServiceLoader.load(View.class)
。有没有办法让我可以从两个调用中获得相同的对象实例?
这个想法是,在将视图加载为 GUI 之后,我希望能够登录同一个 GUI 实例,而不是另一个。就目前而言,我被两个单独的实例困住了,所以日志确实出现了。
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
目录标记resources
为Project Settings > Modules
:
这是我的output
目录的样子:
正如您在上面看到的,实现类的类文件没有添加到out/
目录中。
这是我的完整目录结构:
问题
我显然在这里做错了什么,但我无法理解是什么。META-INF
将目录添加或标记为resources
的正确方法是什么,或者包含所有服务实现类的正确方法是什么?
任何有关解决此问题的帮助或提示表示赞赏。
编辑 - 1
添加src/resource
文件夹并将META-INF
目录放在其中。但是我仍然没有在out
目录中看到实现类的类文件。
此外,我注意到的一件事是,一旦我将任何目录标记为resource
项目结构中的目录 - 它就会从左侧的项目视图中消失。有什么奇怪的地方吗?