问题标签 [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 回答
1267 浏览

java - 使用不同的类加载器加载类,以便在不需要时从 JVM 中卸载它们

在我的应用程序中,我使用 ServiceLoader 来加载具有不同 ClassLoader 的模块(来自 .jar 文件的类),以便在不需要时从应用程序的上下文和 JVM 本身完全卸载它们。我知道“从 JVM 卸载类”可能不是一个常见的话题,有一些条件会发生这种情况,所以我正在做出必要的努力。为了确保一切都按预期工作,我正在使用 -XX:+TraceClassLoading 和 -XX:+TraceClassUnloading 跟踪类的加载和卸载,来自此参数的信息显示我可以完全卸载任何模块mi app 和 JVM 本身(从 JVM 卸载发生在完整的 GC 期间)。所有这一切似乎工作正常......但我的问题是为什么加载模块类的 .jar 文件由 JVM 保持打开?jars 不能被删除,但 JVM 说已经从它们中卸载了这些类。显然这是在 JVM 执行期间,但是如果 JVM 没有从它们加载类,为什么要保持打开那个 .jar 文件呢?我可以做些什么来强制 JVM 释放那个 .jar 文件?

0 投票
1 回答
1724 浏览

java - 在 Eclipse 插件中测试 ServiceLoader

我的工作区中有四个 Eclipse 插件项目(创建一个新的 Java 项目,右键单击,配置,转换为插件项目)。第一个 ( my.runtime) 包含一个接口 ( MyFactoryInterface) 和一个类 ( MyClient),该类定义了一个方法 ( List<String> getAllFactoryNames()),该方法 ( ) 通过加载该接口的所有实现java.util.ServiceLoader并在它们上调用方法 ( String getName()),收集结果并在列表中返回它们。

为了测试该类,我在第二个项目中进行了 JUnit 测试(my.runtime.test设置my.runtime为 Fragment-Host),检查项目中的虚拟实现(MyDummy返回"Dummy")返回的名称是否在返回my.runtime.test的列表中MyClient.getAllFactoryNames()。到目前为止,它工作正常。

在第三个项目(my.extensionmy.runtime作为依赖项)中,我有一个类(MyHello),它使用返回的名称MyClient.getAllFactoryNames()来返回问候列表("Hello "+name)。

同样,为了测试这一点,我有一个项目(作为 Fragment-Host),其中包含另一个实现(my.extension.test作为名称返回)和一个 JUnit 测试用例检查是否在返回的问候语中。该测试失败,因为 MyClient 仍然只找到实现,而不是实现。这两种实现都伴随着文件中的匹配条目。my.extensionMyWorld"World""Hello World"MyHello.getGreetings()MyDummyMyWorldMETA-INF/services/my.runtime.MyFactoryInterface

我目前使用以下代码来加载实现:

我知道我可以提供一个 ClassLoader 作为第二个参数ServiceLoader.load,但我不知道如何获得一个知道所有插件项目的...有什么建议吗?或者 ServiceLoader 不是解决这个问题的正确工具?

0 投票
3 回答
1408 浏览

java - 类型 parm 本身是泛型的 ServiceLoader

这会产生编译器错误:“ add(Iterable<Foo<?>>)FooRepository 类型中的方法不适用于参数(ServiceLoader<Foo>)”。

我希望能够将 anIterable<Foo>视为Iterable<Foo<?>>,但就其本身而言,它似乎不起作用。将结果转化ServiceLoader.load(Foo.class)为我可以喂食的最干净的方法是什么FooRepository.add()

0 投票
2 回答
868 浏览

php - 在 PHP 中寻找一种优雅的方式来加载依赖项/服务/配置?

我正在构建一个 MVC PHP 框架,我想知道哪些是在我的类中加载我需要的内容的最佳实践,无论是其他类还是普通配置。

直到今天,我一直在使用单例、注册表和最近的依赖注入容器。虽然许多人声称 DI 是要走的路,但在我看来,它只是将组件之间的耦合问题转移到了另一个地方。

Singletons 引入了全局状态,registry 引入了紧密耦合,DI 引入了......嗯,很多复杂性。我仍然很困惑,找不到正确的方法将我的课程相互连接。

与此同时,我想出了一个定制的解决方案。实际上这不是一个解决方案,它只是从我的代码中抽象出服务加载的实现。

我用 _load_service 和 _load_config 方法构建了一个抽象类,我的框架的所有组件都扩展了这些方法,以便加载其他服务或配置。

加载它们的实现现在只在一个地方实现,即基类,所以至少我在组件中去掉了如下代码行:

或者

现在,如果想要一个数据库实例,我会这样做

以及服务加载器、容器、注册表或任何可以在单个类方法中轻松更改的实现,而无需搜索我的所有代码来更改对我之前使用的任何容器实现的调用。

但正如我所说,我什至不确定我将使用什么方法来加载类和配置。

你有什么意见?

0 投票
1 回答
293 浏览

spring - Spring 方面不适用于 ServiceFactoryBean 创建的 bean

我在将方面应用到 ServiceFactoryBean-created(ServiceLoader-loaded)bean 时遇到问题。

我的 spring 上下文看起来像这样:

我的方面定义如下:

出于某种未知原因,方面仅应用于 myAnotherBean 的调用,而不应用于 myBean 的调用。有任何想法吗 ?

0 投票
3 回答
28400 浏览

java - ServiceLoader 查找接口的实现

我尝试使用 Java ServiceLoader来查找所有实现特定接口的类,如下所示:

不幸的是,当我在调试模式下运行 Eclipse 时,ServiceLoader 找不到任何类。我觉得我错过了一个微不足道的点......

0 投票
0 回答
317 浏览

java - ServiceLoader 或其他动态加载插件

通读

其中描述了 ServiceLoader。相当简单。使用此 API 的人,通常如何轮询类路径或应用程序路径以获取新更新?每 x 分钟调用一次 ServiceLoader.reload 方法?

还是人们使用其他开源 API?或者像框架一样滚动那里自己的ServiceLoader?

0 投票
1 回答
693 浏览

java - 使用 ServiceLoader 进行动态库加载和前后检查

这个问题是解决附加库动态加载问题的下一步。我有一些这样的:

检查 AttachProvider 的可用性如下所示:

如果您使用 JDK 的私有 JRE 运行它,那么一切都会好起来的,因为 JDKattach.dll在默认库路径中。

问题

仅当我删除第一次出现时,这才有效isAttachProviderAvailable,因为如果我尝试AttachProvider在它可用之前实例化,那么我无法在稍后attach.dll加载时实例化它。ServiceLoader不会根据新的库路径刷新。如何解决这个问题?如何在AttachProvider不实例化的情况下检查可用性或如何刷新ServiceLoader

0 投票
3 回答
844 浏览

java - java在Java中实现动态插件

我根据本教程开发了一个加载插件的应用程序:http://solitarygeek.com/java/a-simple-pluggable-java-application 但我遇到了一个问题。在我的主应用程序中,我有一个带有静态方法的类,我如何从我的插件内部访问该类?当我尝试从加载的插件访问该类时,它给了我一个找不到类的错误,尽管插件和应用程序正在运行。谢谢

0 投票
2 回答
2951 浏览

java - Java SPI - ServiceLoader - 将多个 JAR 添加到 APP 类路径

我在我的项目中实现此逻辑时遇到问题。我正在使用 ServiceLoader,我不知道它是否可能,但我想将 JAR 动态添加到应用程序的某个已知目录中,以便应用程序在启动时加载它们。我唯一实现的是我知道如何创建可扩展的 ONE JAR(使用 META-INF/服务),因此我可以向这个 JAR 添加越来越多的提供程序和类(实现)。JAR 像普通库一样包含在类路径中,因此应用程序知道它。我想要实现的目标:我不想扩展一个 jar 文件,但我想通过添加更多 jar 来扩展应用程序,例如带有提供程序(服务)的插件,但我不知道如何。

感谢帮助!