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

jboss7.x - JBoss 7 服务加载器

有一个接口MyInteface

System 有几个 EAR,每个 EAR 都有自己的接口实现。我需要找到所有没有名称的实现(? extends MyInterface)。

我决定使用java.util.ServiceLoader并创建了一个带有 META-INF/services/com.example.MyInterface 的 jar,这个 jar 可以部署在任何 EAR 中。

jar 在 int 的 init 方法中有一个 servlet 和以下代码:

但是迭代器仍然是空的..

我尝试在 EARs META-INF 中添加 services/com.example.MyInterface,但结果是一样的。

这种方法在 jboss 6 和 tomcat 中运行良好。

0 投票
1 回答
775 浏览

weblogic - WebLogic12c 中的 ServiceLoader 问题

我一直在尝试将我们的 Activiti 实现重构为使用 CDI,但遇到了许多问题。我已经花了太多时间试图解决这个问题,但我就是不能放手......我想我现在已经解决了这个问题,在不涉及 Activiti 的情况下建立了一场干净的结构化战争,并且已经能够重现我认为的主要问题。

基本上我有 jar1 和 jar2,这两个 CDI 都通过包含 META-INF/beans.xml 启用。两个 jar 都在 META-INF/services/test.TheTest 中指定了一个类,指向各自 jar 的本地实现。jar1 依赖于 jar2。此外,两个 jar 都指向 javax.enterprise.inject.spi.Extension 的实现,从而触发场景。在 Extension 的每个实现中,我都有一个类似的方法:

现在,我的问题是ServiceLoader在运行 WebLogic12c 时在这两种情况下都看不到任何实现。相同的代码在 Jboss 7.1.1 和 Glassfish 中都可以正常工作,列出了 test.TheTest 接口的两个实现。

假设这确实是 WebLogic 12c 中的一个问题,还是我做错了什么?请记住,我只是想模拟我们在整合 Activiti 时使用的生产设置。

问候,/彼得

0 投票
1 回答
170 浏览

java - 如何在构建过程中包含自定义文本文件

最近我一直在写插件,然后我使用 ServiceLoader 加载这些插件。为了让 ServiceLoader 找到我的插件,必须在 META-INF/services/ 下的 jar 中包含一个文本文件。文本文件必须以 ServiceLoader 正在“寻找”的接口命名,并且必须包含实现类的规范名称。所有这些都工作得很好,但是这种方法有一个非常烦人的问题:每次构建项目时,我都必须手动将 /services/ 文件夹以及文本文件添加到 jar 中(使用 Winrar)。这在开发过程中非常麻烦,因为我必须不断地重新构建项目才能进行测试,这意味着我还必须添加文件夹和文本文件每次也用手。

我真的希望有一种方法可以让 Java 在构建项目时自动添加 META-INF/services/ 文件夹以及文本文件,因为这让我发疯了!:)

顺便说一句,我正在使用 Netbeans,它 (afaik) 在内部使用 Ant 来自动化构建过程。我想这些信息可能与我的问题有关。

谢谢!

0 投票
1 回答
264 浏览

java - 具有相同 FQN 的多个类 (ServiceLoader)

我正在使用java.util.ServiceLoader创建一个轻量级插件框架。

我目前正在努力解决如何让多个实现类具有相同的 FQN。我想在类路径上有两个相同插件的副本,并且可以访问 META-INF/services 目录中给出的两个实现类。

这里有一些简单的 Eclipse 项目来说明我的意思: https ://docs.google.com/open?id=0B4MxFm-ACB3IUmswN0dpMExTVms

ServiceLoaderIntf 具有由插件实现的简单接口。ProjectOne 和 ProjectTwo 代表插件。ServiceLoader 有 Tester 类,它遍历实现者并调用它们的 init() 方法。

即使实现类具有相同的 FQN,我如何才能让它识别所有实现者?现在它只识别 ProjectOne 中的插件类。

0 投票
1 回答
120 浏览

java - Java Applet 和 ServiceLoader

默认情况下,Java Applet 不会从 someJar.jar!/META-INF/services/ 加载服务类,这会导致 NoClassDefFoundError 异常。

如何让它发挥作用?

0 投票
1 回答
297 浏览

java - 部署在 Tomcat Web 服务器上的 Axis2 Web 服务代码中的 ServiceLoader 使用

我在 Ubuntu 的 Axis2 平台上部署了一个 .aar 文件。我正在使用 Oracle JDK1.7 Tomcat 7.0.35 和 Axis2 1.6.2

最近我做了一个重构,使用 java.util.ServiceLoader 类来动态加载一些类的实现。

这是我的 aar 文件结构:

在我的 Eclipse 开发环境中,我的方法运行没有任何问题,但是当它们在 Axis2 Tomcat 平台上运行时,ServiceLoader 类无法加载实现类。可能是什么问题?任何帮助表示赞赏。谢谢。

0 投票
3 回答
29759 浏览

java - 使用 ServiceLoader 动态加载插件 jar

我正在尝试为我的应用程序创建一个插件系统,我想从一些简单的东西开始。每个插件都应该打包在一个 .jar 文件中并实现SimplePlugin接口:

现在我已经创建了SimplePlugin一个 .jar 的实现,并把它放在主应用程序的 plugin/ 子目录中:

在主应用程序中,我想获取PluginTest. 我尝试了两种选择,都使用java.util.ServiceLoader.

1.动态扩展类路径

这使用已知的 hack 在系统类加载器上使用反射来避免封装,以便添加URL类路径。

plugins/ 目录按预期添加(可以检查调用sysLoader.getURLs()),但是ServiceLoader对象给出的迭代器为空。

2. 使用 URLClassLoader

这使用了另一个定义,ServiceLoader.load带有类的第二个参数ClassLoader

再一次,迭代器从来没有“下一个”元素。

我肯定缺少一些东西,因为这是我第一次“玩”类路径和加载。

0 投票
1 回答
2684 浏览

java - Java的ServiceLoader和测试资源

我有一个 Web 应用程序,它将 Hibernate Integrator 定义为 Java ServiceLoader 规范的一部分,如下所示:

src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator

这是根据此处的 Hibernate 指南完成的。

我的问题是,当我尝试执行单元测试时,主 Integrator 描述符仍然被解析和实例化。这意味着,因为我在单元测试中模拟了大部分应用程序,所以当集成器尝试运行它时会遇到导致我的测试失败的错误。

我在测试资源中定义了相同的文件:

src/test/resources/META-INF/services/org.hibernate.integrator.spi.Integrator

但相反,我发现测试和主集成器文件都被解析了。

我预计测试资源会覆盖主要资源,从而使主要资源过时,但事实并非如此。由于这两个文件都在类路径上(我通过 Maven 使用 surefire-plugin 运行测试,该插件将两者都test-classes放在classes类路径上)。类似的事情发生在persistence.xml.

在我的单元测试环境中,我不希望实例化任何 Integrator,因为我想尽可能手动地控制这些 bean 的构造。假设我正在测试执行单元,我不希望出现其他可能影响测试运行的 bean,例如 Integrator。我认为这是单元测试期间完全合法的要求。但是,虽然主要资源仍由 解析ServiceLoader,但这是不可能的。

我来做的解决方案是基于persistence.xml这里发布的解决方案:

如何配置 JPA 以在 Maven 中进行测试

我的问题是,在单元测试期间是否有比强制重命名更好的方法来排除主要资源的处理,尤其是在ServiceLoader文件的上下文中?

尝试更好地总结一下:

当您在类路径上有两个文件都以相同的服务接口命名时会发生什么?对我来说,似乎两个文件中的所有服务都被实例化了。似乎没有覆盖。

0 投票
1 回答
930 浏览

java - ServiceLoader.next 导致 NoClassDefFoundError

我问是因为我完全不确定我做对了。我正在将 Eclipse 用于 Web 项目。我们称它为包中的 WebProject (duh) com.web.project

我希望 WebProject 在运行时加载 JAR 插件,所以我想我可以利用java.util.ServiceLoader. 所以我com.web.project.WebProjectPlugin在 WebProject 项目中创建了一个接口,其中包含插件必须实现的所有方法。

然后我创建了项目 PluginProject,在其构建路径中添加 WebProbject/build/classes 作为类文件夹:

然后我在插件项目中创建了一个 META-INF/services 文件夹,将文本文件com.web.project.WebProjectPlugin放入其中,包含唯一的一行“com.web.project.plugin.TestPlugin”。

我导出了 JAR 文件,检查了添加的 build/classes 文件夹并将其放在硬盘驱动器的某个位置。当 WebProject 启动时,它会执行以下操作:

pluginsDir是一个File指向 JAR 文件所在目录的对象。起初它似乎srvl完成了它的工作,因为iter它不是空的,但是NoClassDefFoundError当它到达iter.next().

我已经设法创建了一个插件管理器项目来测试ServiceLoader,它运行得很好,但它是一个普通的控制台 Java 应用程序,而不是一个 Web 项目。那么,我在这里做错了什么?

我有点困惑:它怎么找不到的类定义com.web.project.WebProjectPlugin,因为它在同一个正在运行的项目中?这与URLClassLoader我正在使用的对象有关吗?

这是堆栈跟踪

0 投票
1 回答
3865 浏览

android - 将“META-INF/services”文件保存在 apk 中

我有一个已经在 J​​avaSE 上工作的自定义字符集。

我的 CharsetProvider 的类在一个文件中指定,java.nio.charset.spi.CharsetProvider并且META-INF/services所有内容都正常加载并按预期工作。

但是现在我也在 android 上使用 lib,但是字符集没有加载到 Android-App 中。

如何集成我的字符集,以便它可以像预期的那样在 Android 应用程序中使用?

目前我正在做这样的解决方法:

哪个有效,但对我来说似乎无效,因为每次我尝试使用自己的字符集进行这样的解码时,都会引发异常并创建 CharsetProvider-Object。

当然可以通过单例模式减少创建。但问题是要完全避免直接使用 MyCharsetProvider。

编辑 :

由于META-INF/services/java.nio.charset.spi.CharsetProvider在 apk 中丢失了,我虽然可能 proguard 删除了它。然后我在 proguard.cfg 中尝试了以下选项:

但问题仍然存在。那么如何META-INF/services使用ant(netbeans)自动将这些文件从我的apk中获取?