问题标签 [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 - 如何自定义 ServiceLoader 查找插件罐的位置
我有一个包含两个项目的多模块项目:Core和A。这个想法是在 Core 启动时启动/运行 A。
如何自定义 ServiceLoader 以从核心查找和调用Plugins文件夹中的模块?
核
查看.java
设想
我正在开发的应用程序是一个多模块独立桌面应用程序。例如,Core 将在左侧(left-pane)保留一个窗格。左窗格将接受nodes
来自任何实现名为LeftPane
. A实现了LeftPane
接口。每当 Core 启动时,它应该扫描一个文件夹,在这种情况下是插件,并自动启动那里的所有包,包括 A,它将继续填充左窗格。
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 的第二个实现可见以避免我的异常?
谢谢
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 文件夹中并且它可以工作,但是每次重新部署都会删除它们,理想情况下我希望避免重新部署插件。
spring - Spring没有为ServiceListFactoryBean对象创建代理
我正在使用 ServiceFactoryBean 和 ServiceListFactoryBean 收集一些 SPI 实现实例,并自动连接到我的服务 bean。现在我创建了一些方面来拦截这些类以测量性能和记录调用。
我注意到 spring 正在为 ServiceFactoryBean 捕获的实例创建代理并注入到服务 bean 中。但它没有为 ServiceListFactoryBean 捕获的实例列表创建任何代理。
我如何告诉 spring 为这些 bean 创建代理以使我的方面工作?
以下是我的代码片段 -
收集 SPI 实现并将其公开以进行自动装配的配置
方面(这个有效)
(这个不行)
java - 在 Glassfish4 Java EE 应用程序中使用 ServiceLoader 时出现 ClassNotFoundException
在 Java EE 应用程序中,我尝试使用 Java 的ServiceLoader加载服务。我试图加载的 .jar 文件在测试 Java SE 应用程序中工作,所以我认为它是正确的。但是,以下代码在以下位置失败itr.next
:
ClassNotFoundException 中抛出的异常,抱怨找不到WorkflowStepSPI
,这显然是存在的(否则代码将无法编译)。在另一个测试中,我验证了Class.forName
返回这个类。
我已尝试按照此处的建议创建自己的 URLClassLoader 实例,并按照此处的建议直接加载类,但无济于事。
有任何想法吗?
* 更新 *
根据要求,这是堆栈跟踪:
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/* 文件。不需要额外的编译器开关。这个库也可以正确处理增量编译。”
在我的情况下,什么都没有产生。有人可以帮我吗?
java - 为什么我在 Eclipse 包资源管理器中看不到我在文件资源管理器中看到的所有文件夹
我在 Eclipse 中创建了一个 Maven 模块,并且有一个名为“target”的文件夹。我在 Eclipse 的包资源管理器中看到的那个。如果我打开它,有几个文件夹。如果我在 Windows 上的文件资源管理器中打开它,我会看到更多文件夹,例如其中一个名为 classes/META-INF/services/* 的文件夹是我在模块中的某些类之前使用注释创建的。为什么我只在 Windows 文件资源管理器中看到这些,而在 Eclipse 包资源管理器中看不到,以及如何更改它?
hadoop - 如何创建不覆盖 META-INF/services 下条目的胖 jar
我有以下 gradle 构建配置:
我拥有的主要方法只是以下代码:
当我按预期从 IDE 运行 main 方法时,我得到以下输出:
但是当我运行 gradle fat jar 任务并创建 fat jar 时,在通过终端使用 (java -jar) 运行主要方法后,我得到:
我发现当创建 fat jar 时,META-INF/services下的条目会针对所有依赖项进行合并,因此我丢失了YarnClientProtocolProvider的声明,我需要在代码中进一步声明。
YarnClientProtocolProvider在hadoop-mapreduce-client-jobclient.jar中声明
LocalClientProtocolProvider在hadoop-mapreduce-client-common.jar中声明
有没有人知道如何创建一个不合并 META-INF/services 下条目的胖罐子?!
java - 在 Spring-Project 中使用 SystemLoader / SpringFactoryLoader 加载外部 Jar
首先:我对spring-boot和maven真的很陌生。所以我仍然不明白所有东西是如何连接在一起的。
我想要实现的是我的应用程序的某种插件功能。根据我的研究,似乎最好的方法是ServiceLoader
使用SpringFactoriesLoader
.
根据网上的一些说明,我将两个项目放在一起
JamesApplication 提供了一个应该被实现的接口(de.maxrakete.james.device.domain.DeviceInterface
)。
TemperatureSensor 实现了所述类并以多种方式公开它。
对于
ServiceLoader
在META-INF\services\de.maxrakete.james.device.domain.DeviceInterface文件中的这个内容de.maxrakete.james.plugin.TemperatureSensor.TemperatureSensor
对于
SpringFactoriesLoader
文件META-INF\spring.factories中的这个内容de.maxrakete.james.device.domain.DeviceInterface=de.maxrakete.james.plugin.TemperatureSensor.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
结论
因此,存在三个可能的错误源
- 添加类路径文件的 cli 命令错误
- META-INF 文件夹中的接口声明错误
- 加载器的错误实现
- 也许我以错误的方式编译源代码?
- 错误的配置
pom.xml
我真的不知道问题可能是什么。我试图为您提供尽可能多的信息以及我研究的所有步骤。我希望有人能找到一些我可能忽略的有用线索。
谢谢大家!
java - 在注解处理器中使用 ServiceLoader
是否可以在注释处理器ServiceLoader
的方法中使用?init(ProcessingEnvironment)
运行 main 方法会生成我在 META-INF/services 文件中指定的服务。但是,当该init(ProcessingEnvironment)
方法作为另一个项目的构建的一部分被调用时,它不会列出任何服务。
有没有办法使这项工作?