问题标签 [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 投票
2 回答
5140 浏览

java - 何时在 OSGi 之类的东西上使用 ServiceLoader

作为对依赖项过敏的人,我什么时候会使用 OSGi 之类的东西而不是内置的 java 6 http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html(我想要让插件罐子被放入)。

(仅供参考,这是在一个 scala 应用程序中,对任何建议开放,ServiceLoader 非常接近我想要的)。

0 投票
3 回答
1937 浏览

java - 如何使 java ServiceLoader 在 NetBeans 6.9 模块应用程序中工作

我在 NetBeans 模块应用程序中使用 java ServiceLoader 时遇到了麻烦。这是我正在尝试做的事情(它适用于 Eclipse 中的普通 java 应用程序):

我有一个 interface.jar,它声明了接口。我有 implementations.jar,它有这个接口的几个实现,都在 spi/META-INF/services/my.package.name.MyInteface 文件中指定(这个文件在implementations.jar 中)。

我还有一个类 ImplementationHandler(在另一个 handler.jar 中),它具有以下方法来加载所有实现:

此代码返回 Eclipse 普通应用程序中的所有实现(foundImplementations.size() > 0)。

但是在 NetBeans 下,它找不到任何东西(foundImplementations.size() == 0)。

更多细节:
我有一个 NetBeans 模块应用程序的源代码(开源,不是我写的),我需要使用一些 MyInterface 实现来扩展它。interface.jar、implementations.jar 和 handler.jar 是在 Eclipse 中创建的,它们是另一个应用程序的一部分。

在 NetBeans 中,我打开了需要使用新实现的模块,并将所有 3 个 jars 添加为外部库(NetBeans 将它们复制到它的 ext 文件夹中,我不想要,但我无能为力 - 我希望它们在另一个 myext 文件夹中,但那是另一回事)。然后我重建了所有东西并尝试使用我的一个实现,但没有找到......获取实现的代码在 ImplementationHandler 类中,如下所示:

我得到了我的异常“无法找到 MyInteface 类:myImplementationName”...

我对 NetBeans 的了解非常有限,我想知道我还需要做些什么才能使其正常工作吗?

0 投票
1 回答
2404 浏览

java - Java ServiceLoader 在开发期间如何工作?(在构建 JAR 之前进行单元测试?)

Java 的 ServiceLoader 需要这些条目出现在 JAR 文件中。有没有办法在运行时以编程方式在 IDE 中添加这些服务条目以进行单元测试?特别是当 JAR 尚未构建时。

0 投票
3 回答
3028 浏览

java - 在 Java 中还有什么可以用作 ServiceLoader 的替代品?

我正在寻找类似 ServiceLoader 的东西,但它不依赖于 SPI 文件,应该枚举所有服务实现,然后将其添加到某个类加载器的路径中,以便找到。

假设有一个应用程序,它具有接口和服务的一些实现。可以使用什么框架,允许您向应用程序添加一个新的 JAR,其中包含一些新的实现,并且它们可以自动添加到该应用程序内所有类加载器的类路径中?所有的类加载器在这里都非常重要,因为如果这是一个 NetBeans 模块应用程序,NetBeans 平台会产生奇怪的魔力,而且你永远不知道哪个线程使用哪个类加载器,使用哪个类路径等等......这也很棒,如果不需要重新启动应用程序即可找到新的 JAR,但这不是一个重要的要求。

我已经听说过 OSGi,但这似乎太大了,我只需要它的 1% 的功能。

感谢您的任何建议!

0 投票
1 回答
4371 浏览

java - 将 ServiceLoader 配置文件放在 Web 应用程序的什么位置

我正在 Eclipse 中编写一个 Web 应用程序。

我正在尝试使用 ServiceLoader 类来加载一些插件。

ServiceLoader 的文档说我需要在 META-INF/services 中放置一个文件。

我已将文件放在 WebContent/META-INF/service 文件夹中,但是当我通过 Eclipse 运行 JUnit 测试时,它没有找到任何插件。

这是文件的正确位置吗?

另外,如何从 ServiceLoader 获取更多调试信息,例如它正在搜索文件的文件夹?

0 投票
0 回答
246 浏览

grails - 如何在 Grails 中使用 Java ServiceLoader 类?

我已经在许多其他应用程序中使用了 JDK 的SPI 机制,没有任何问题;但是,我似乎无法让它在 Grails 中工作。

我已经从静态初始化程序和类构造函数中尝试了通常的代码(如下所示),但都没有成功。

迭代器实际上并不遍历实现类。

我也试过:

它应该为当前类使用类加载器,但这也不起作用。

我应该使用其他一些机制来加载实现类吗?

0 投票
5 回答
6491 浏览

java - Java,获取实现特定接口的 URLClassLoader 可用的所有类

我正在开发一个命令行应用程序,该应用程序在运行时加载用户指定的文本翻译器(通过命令行 arg 提供的类文件/jar 的路径)。基本上我正在使用该参数并使用它来创建 URLClassLoader。然后我需要找到实现 Transable 接口的 URLClassloader 可用的所有类。

现在我只允许这个命令行 arg 是一个包含类文件的目录。使解决方案相当简单(下面的代码)。但老实说,我不喜欢该解决方案,因为它会分解 jar 文件、jar 文件目录等......此外,这显然会分解任何具有已定义包的类,因为 loadClass 需要包含包的全名。谁有更好的方法?

0 投票
5 回答
5584 浏览

java - 在安卓上使用服务加载器

我对 java 和 android 开发非常陌生,并且学习我正在尝试从一个应用程序开始,以像 munin 一样收集统计数据和信息。我试图能够在我的应用程序中加载“插件”。这些插件已经在应用程序中,但我不想单独调用它们,但能够迭代它们。我试图使用 serviceloader 但永远无法将 META-INF/services 放入我的 apk。所以我想知道是否可以在android上使用serviceloader谢谢
编辑:我在问java.util.ServiceLoader,我认为应该,但我不知道如何将我的服务文件夹放入META-INF APK

0 投票
5 回答
23570 浏览

java - 具有多个类加载器的 Java ServiceLoader

在具有多个 ClassLoader 的环境中使用ServiceLoader的最佳实践是什么?文档建议在初始化时创建并保存单个服务实例:

这将使用当前上下文类加载器初始化 ServiceLoader。现在假设此代码段包含在使用 Web 容器中的共享类加载器加载的类中,并且多个 Web 应用程序想要定义自己的服务实现。这些不会在上面的代码中被选中,甚至可能加载器使用第一个 webapps 上下文类加载器进行初始化,并向其他用户提供错误的实现。

总是创建一个新的 ServiceLoader 似乎会浪费性能,因为它每次都必须枚举和解析服务文件。编辑:这甚至可能是一个很大的性能问题,如this answer about java's XPath implementation所示。

其他图书馆如何处理这个问题?他们是否缓存每个类加载器的实现,他们是否每次都重新解析他们的配置,或者他们只是忽略这个问题并且只适用于一个类加载器?

0 投票
1 回答
2122 浏览

java - 为什么 Eclipse JUnit4 Runner 不拾取 META-INF/services 文件

我正在使用 Maven 和 Eclipse(使用 M2E)来构建一个依赖 java.util.ServiceLoader 来动态加载一些工厂类的项目。当我在 Maven 中运行它时它工作正常,但是当我使用内置的 Eclipse JUnit4 Runner 运行测试时,它无法获取服务并且测试不成功。

我需要做些什么来手动将 META-INF/services 添加到 JUnit 构建路径?我无法让它在 src/main/resources/META-INF/services 或 src/main/java/META-INF/services 中工作。是否与 M2E 设置构建路径的方式有关?我在一个全新的项目中进行了测试,但仍然失败。

失败的基本代码是:

测试看起来像:

TestFactory 定义为:

TestFactoryImpl 定义为:

我最初使用的是http://weblogs.java.net/blog/kohsuke/archive/2009/03/my_project_of_t.html中的 MetaInfServices 生成器,但是当我删除它并手动创建文件时,它仍然失败使用 Maven Surefire 插件运行时成功的 Eclipse 方法相同。