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

java - 如何自定义 ServiceLoader 查找插件罐的位置

我有一个包含两个项目的多模块项目:CoreA。这个想法是在 Core 启动时启动/运行 A。

如何自定义 ServiceLoader 以从核心查找和调用Plugins文件夹中的模块?

查看.java


设想

我正在开发的应用程序是一个多模块独立桌面应用程序。例如,Core 将在左侧(left-pane)保留一个窗格。左窗格将接受nodes来自任何实现名为LeftPane. A实现了LeftPane接口。每当 Core 启动时,它应该扫描一个文件夹,在这种情况下是插件,并自动启动那里的所有包,包括 A,它将继续填充左窗格。

0 投票
0 回答
398 浏览

osgi - OSGi 容器中的 Jetty-9 HTTP/2。无法通过 ServiceLoader 加载 HTTP/2 的 HttpFieldPreEncoder 实现

最近我正在尝试调用通过 Apache-CXF 发布的 REST 服务。一切都嵌入在带有 Jetty 9.4.1 的 Equinox 3.11.0 中。

容器启动 Jetty,为 HTTP/2 配置:

Wenn 我通过 https/ssl 调用 REST-Service 我得到一个错误:

似乎(我已经证明),PreEncodedHttpField无法通过ServiceLoader加载 HttpFieldPreEncoder 的所有实现。

ServiceLoader 只看到一个Http1FieldPreEncoder,它与 PreEncodedHttpField 位于同一个 Bundle 中,因此对于BundleClassLoader是可观察的。该实现在索引“0”下注册。

在我的情况下,应该使用 HTTP/2 实现HpackFieldPreEncoder,它捆绑在 http2-hpack 中,但对ServiceLoader不可见

是否有任何解决方法可以使 PreEncodedHttpField 的第二个实现可见以避免我的异常?

谢谢

0 投票
0 回答
383 浏览

tomcat - 将 ServiceLoader 与 Tomcat 一起使用:将外部 jar 添加到 webapp 类加载器

我有一个使用 Google Guice 模块的 webapp,部署到 Tomcat 9。

我想为用户提供动态添加一些暴露一些绑定的模块的可能性,而无需重新打包 webapp 以包含它们。

我使用这个问题中的 ModuleLoader:有人将 ServiceLoader 与 Guice 一起使用吗? 在我的主应用程序中,我定义了一个自定义接口:PluginModule

插件模块类如下所示:

我想我的插件配置得很好,因为 webapp 也可以独立运行,在这种情况下,我的插件被找到,模块被安装并且包含的​​绑定可用。

但是,当部署到 Tomcat/webapps 时,我收到此错误:

该插件位于 Tomcat/shared/libs 中(在 catalina.properties 中配置了“shared.loader”)

我认为它与一些类加载器问题有关,也许加载的接口在 webapp 和插件中被认为不一样,所以我尝试将 PluginModule 接口放入我已经放入 shared/libs 的 API jar 中,但是我遇到了同样的问题。

我还尝试将我的插件放入外部文件夹并使用 setenv.sh 脚本将其设置在 CLASSPATH 中,但没有成功。

这看起来像是 OSGi 的一个很好的用例,不幸的是我(目前)无法修改应用程序以使其准备好 OSGi。

我怎么能把一些插件罐子放在某个地方,让 webapp 用 ServiceLoader 轻松加载它们?我可以将它们放在 webapp/WEB-INF/lib 文件夹中并且它可以工作,但是每次重新部署都会删除它们,理想情况下我希望避免重新部署插件。

0 投票
1 回答
360 浏览

spring - Spring没有为ServiceListFactoryBean对象创建代理

我正在使用 ServiceFactoryBean 和 ServiceListFactoryBean 收集一些 SPI 实现实例,并自动连接到我的服务 bean。现在我创建了一些方面来拦截这些类以测量性能和记录调用。

我注意到 spring 正在为 ServiceFactoryBean 捕获的实例创建代理并注入到服务 bean 中。但它没有为 ServiceListFactoryBean 捕获的实例列表创建任何代理。

我如何告诉 spring 为这些 bean 创建代理以使我的方面工作?

以下是我的代码片段 -

收集 SPI 实现并将其公开以进行自动装配的配置

方面(这个有效)

(这个不行)

0 投票
2 回答
1072 浏览

java - 在 Glassfish4 Java EE 应用程序中使用 ServiceLoader 时出现 ClassNotFoundException

在 Java EE 应用程序中,我尝试使用 Java 的ServiceLoader加载服务。我试图加载的 .jar 文件在测试 Java SE 应用程序中工作,所以我认为它是正确的。但是,以下代码在以下位置失败itr.next

ClassNotFoundException 中抛出的异常,抱怨找不到WorkflowStepSPI,这显然是存在的(否则代码将无法编译)。在另一个测试中,我验证了Class.forName返回这个类。

我已尝试按照此处的建议创建自己的 URLClassLoader 实例,并按照此处的建议直接加载类,但无济于事。

有任何想法吗?

* 更新 *

根据要求,这是堆栈跟踪:

0 投票
1 回答
1406 浏览

java - Maven中不同模块之间的ServiceLoader和META-INF/服务生成器?

我想在 Maven 项目中的不同模块之间使用服务 ServiceLoader。我有一个名为 iMage 的父模块。在父模块中有一个名为 jmjrst.main 的模块,它有一个名为“JmjrstPlugin”的公共抽象类。

然后是另一个名为 prizm-plugin 的模块,它具有以下类:public class HelloWorldPlugin extends JmjrstPlugin{ ... }。我还添加了 jmjrst.main 作为对 prizm-plugin 和 vica-versa 的依赖项。

为了使用 ServiceLoader 我想使用META-INF/services generator。我在 prizm-plugin 的 pom.xml 中添加了以下行:

HelloWorldPlugin 类的开头是这样的:

META-INF/services 生成器的网站上写道:“当您在 JavaSE6 中使用 javac 时,会自动生成 META-INF/services/* 文件。不需要额外的编译器开关。这个库也可以正确处理增量编译。”

在我的情况下,什么都没有产生。有人可以帮我吗?

0 投票
1 回答
328 浏览

java - 为什么我在 Eclipse 包资源管理器中看不到我在文件资源管理器中看到的所有文件夹

我在 Eclipse 中创建了一个 Maven 模块,并且有一个名为“target”的文件夹。我在 Eclipse 的包资源管理器中看到的那个。如果我打开它,有几个文件夹。如果我在 Windows 上的文件资源管理器中打开它,我会看到更多文件夹,例如其中一个名为 classes/META-INF/services/* 的文件夹是我在模块中的某些类之前使用注释创建的。为什么我只在 Windows 文件资源管理器中看到这些,而在 Eclipse 包资源管理器中看不到,以及如何更改它?

0 投票
1 回答
1653 浏览

hadoop - 如何创建不覆盖 META-INF/services 下条目的胖 jar

我有以下 gradle 构建配置:

我拥有的主要方法只是以下代码:

当我按预期从 IDE 运行 main 方法时,我得到以下输出:

但是当我运行 gradle fat jar 任务并创建 fat jar 时,在通过终端使用 (java -jar) 运行主要方法后,我得到:

我发现当创建 fat jar 时,META-INF/services下的条目会针对所有依赖项进行合并,因此我丢失了YarnClientProtocolProvider的声明,我需要在代码中进一步声明。

YarnClientProtocolProviderhadoop-mapreduce-client-jobclient.jar中声明

LocalClientProtocolProviderhadoop-mapreduce-client-common.jar中声明

有没有人知道如何创建一个不合并 META-INF/services 下条目的胖罐子?!

0 投票
0 回答
1003 浏览

java - 在 Spring-Project 中使用 SystemLoader / SpringFactoryLoader 加载外部 Jar

首先:我对spring-boot和maven真的很陌生。所以我仍然不明白所有东西是如何连接在一起的。

我想要实现的是我的应用程序的某种插件功能。根据我的研究,似乎最好的方法是ServiceLoader使用SpringFactoriesLoader.

根据网上的一些说明,我将两个项目放在一起

  • James(主应用程序)GitHub
  • TemperatureSensor(插件)GitHub

JamesApplication 提供了一个应该被实现的接口(de.maxrakete.james.device.domain.DeviceInterface)。

TemperatureSensor 实现了所述类并以多种方式公开它。

根据这个页面onApplicationEvent,我在MainApplication中尝试了两种不同的实现(参见-function ) :

我正在尝试两种方式来加载 jar,但没有发生任何事情(我应该从插件中获取一些日志消息),但这没有发生。

我运行应用程序的方式是这样的:

java -cp "./plugins/TemperatureSensor-0.0.1-SNAPSHOT.jar" -jar james.war

如您所见,我正在尝试将子文件夹中的 jar 添加到类路径中,但是在 -function 的输出中main(我尝试打印类路径中的所有文件)我只得到Classpath file: /home/max/folder/james.war

结论

因此,存在三个可能的错误源

  1. 添加类路径文件的 cli 命令错误
  2. META-INF 文件夹中的接口声明错误
  3. 加载器的错误实现
  4. 也许我以错误的方式编译源代码?
  5. 错误的配置pom.xml

我真的不知道问题可能是什么。我试图为您提供尽可能多的信息以及我研究的所有步骤。我希望有人能找到一些我可能忽略的有用线索。

谢谢大家!

0 投票
2 回答
1161 浏览

java - 在注解处理器中使用 ServiceLoader

是否可以在注释处理器ServiceLoader的方法中使用?init(ProcessingEnvironment)

运行 main 方法会生成我在 META-INF/services 文件中指定的服务。但是,当该init(ProcessingEnvironment)方法作为另一个项目的构建的一部分被调用时,它不会列出任何服务。

有没有办法使这项工作?