问题标签 [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 - 将 META-INF 放在 Android 项目中的哪个位置
我正在编写一个需要从外部库加载动态插件的应用程序。我的第一个想法是 - 几乎没有想象力 - 使用 JavaServiceLoader
并在谷歌上搜索了一下,我发现文档表明 Android 支持这种操作:http: //developer.android.com/reference/java/util/ServiceLoader .html
但是我真的不明白在哪里放置 META-INF 文件夹(我习惯了 Maven,但我不能在这种情况下使用它)。
有人能告诉我在哪里放置 META-INF 文件夹以及如何让它以通常的方式工作吗?
斯特凡诺
java - 没有 ServiceLoader 的 Neo4J
我一直Neo4J 1.8.x
在应用程序框架中用作嵌入式数据库,它打破ServiceLoader
了Neo4j
. 到目前为止,我已经通过使用Neo4j 的 OSGi 指令解决了这个问题。这效果很好。
但是,这些OSGi
说明不再适用于1.9.0
,1.9.1
或2.0.0-M03
。初始化嵌入式数据库时,出现此异常:
我知道OSGi
设置说明已经从1.9.0
更高版本的OSGI更改,但新的初始化方法并没有解决这个问题。
neo4j
>在/上下文中是否1.8.3
仍然支持,如果是,那么设置它的正确方法是什么?non-ServiceLoader
OSGi
java - 如何在java中覆盖服务提供者
这是一个更普遍的示例问题:我正在使用 xstream 和woodstox,woodstox 在woodstox jar 注册com.ctc.wstx.stax.WstxOutputFactory 中带有javax.xml.stream.XMLOutputFactory 的服务提供程序。我想提供我自己的 javax.xml.stream.XMLOutputFactory 并且在类路径中仍然有woodstox jar。我知道我可以提供自己的系统属性 javax.xml.stream.XMLOutputFactory ,但我正试图从我们的开发运营团队中解脱出来,并使用我的 jar 或我的战争 META 中的服务文件来完成它-INF/服务文件夹。查看 javax.xml.stream.FactoryFinder 的代码如何确保我的 META-INF/services/javax.xml.stream.XMLOutputFactory 文件将是 FactoryFinder 使用的文件?
我们将 xstream 与骆驼一起使用,但找不到将工厂注入 XStreamDataFormat 的方法
java - java.util.ServiceLoader 未加载我的提供程序类
我正在尝试整理一个基本的基于 SPI 的处理程序注册表,我从 HandlerRegistry 中查找它。当我使用 ServiceLoader.load(Handler.class) 初始化提供程序,然后迭代列表以延迟加载它们时,我没有看到该类的任何实例。保持这个尽可能简单,我的 HandlerRegistry 类是:
我有一个 com.example.handler.Handler 接口(为简单起见暂时为空),以及一个实现该接口的 com.example.handler.handlers.DummyHandler 类。我在我的 jar 中创建了一个名为 META-INF/services/com.example.handler.Handler 的文件,其中包含单行
根据javadoc。我的单元测试只是调用 lookup() 方法来验证查找处理程序的项目。当然,最终需要进行某种检查以查看这是否是该项目的正确处理程序,但此时我什至没有看到我的 DummyHandler 类被注册表加载。我在这里做错了吗?
谢谢!
jsf - 如何使服务加载器创建的类处理容器管理的对象
我目前正在编写一个库,我希望我的库的用户实现一个接口。在我的库中,我调用了这个实现。
我正在使用 ServiceLoader 来实例化集成器提供的实现,它工作得很好。集成器在我的库中调用 start() 方法,最后他得到了一些回报。该实现用于为我提供一些我需要的东西,以便获得最终结果。(我故意不使用 CDI 或任何其他 DI 容器,因为我想创建一个可以在任何地方使用的库。在桌面应用程序、spring 应用程序和使用 guice 的应用程序中......)
现在我面临一个问题。我正在创建一个使用我自己的库的展示。这是我使用 jsf 和 CDI 的 web 应用程序。当我从我的库中实例化所述 webapp 中提供的实现时,我正在处理一个非容器托管对象。但是由于这个实现需要使用容器管理的对象,所以我有点搞砸了,因为这永远都行不通。
示例:库中的接口:
战争中的实施:
正如您所看到的,这是我的库构建方式中的一个大问题,因为 bean 将始终为空......这意味着使用 DI 容器的任何人都无法使用我的库。我知道我可以通过 FacesContext 查找来获取 managedbean 并获取 managedbean,但更重要的是,如果您考虑一下,我的库设计得不是很好。
所以结束我的问题:有什么方法可以让服务加载器使用 DI 容器来实例化类?
谁知道解决我问题的更好方法?
谁知道更好的方法来获得我需要的东西而不让集成器实现接口但我可以从集成器获取信息?
我知道这是一个非常抽象的问题,但我有点坚持这个问题。
提前致谢
java - 如何将 Java ServiveLocator 与 One-Jar 一起使用
我正在使用 One-Jar 工具将我的应用程序打包在一个 jar 中:
http://one-jar.sourceforge.net/
它可以工作,但是我在依赖模块中实现的服务存在问题,该模块在单独的 jar 中实现。
该模块使用标准的Java ServiceLoader 机制来提供其服务,即jar 有一个文件META-INF/services/package.name.ServiceProviderClass,它指定要实例化的服务具体类。
但是,当这个 jar 嵌入到由 One-Jar 创建的应用程序“fat-jar”中时,服务加载器机制不会发现它的服务。
知道如何使它工作吗?
干杯,保罗
java - ServiceBus JAVA SDK 高级重载错误,ServiceLoader(非子类型)
我有一个运行一些包的 OSGi 环境,其中一个使用服务总线 API(Azure Java SDK v 0.4.4),并且在我重新加载我的 OSGi 环境后出现了一些错误。工作流程是这样的:
- 初始化 JVM 和 OSGi 框架
- 捆绑包已加载并启动
服务总线包使用“ServiceBusConfiguration.configureWithWrapAuthentication(v,w,x,y,z)”调用创建配置,一切运行顺利
我以编程方式重新启动 OSGi 框架,然后加载并重新启动所有捆绑包
- 服务总线包尝试使用“ServiceBusConfiguration.configureWithWrapAuthentication(v,w,x,y,z)”创建配置,但这次我收到以下错误:
Exception in thread "Thread-7" java.util.ServiceConfigurationError: com.microsoft.windowsazure.services.core.Builder$Exports: Provider com.microsoft.windowsazure.services.blob.Exports not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:231)
at java.util.ServiceLoader.access$300(ServiceLoader.java:181)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:369)
at java.util.ServiceLoader$1.next(ServiceLoader.java:445)
at com.microsoft.windowsazure.services.core.DefaultBuilder.create(DefaultBuilder.java:43)
at com.microsoft.windowsazure.services.core.Configuration.<init>(Configuration.java:52)
at com.microsoft.windowsazure.services.core.Configuration.load(Configuration.java:78)
at com.microsoft.windowsazure.services.core.Configuration.getInstance(Configuration.java:63)
at com.microsoft.windowsazure.services.serviceBus.ServiceBusConfiguration.configureWithWrapAuthentication(ServiceBusConfiguration.java:88)
经过一些调试后,我发现它可能是 ServiceLoader 的问题,更准确地说,当它检查它是否com.microsoft.windowsazure.services.blob.Exports
是子类或实现com.microsoft.windowsazure.services.core.Builder$Exports
时,在第一次运行之后也被检查。
所以在我看来,一定有一些东西会阻止服务的正确重新加载,但我无法弄清楚到底发生了什么。
希望你们中的任何人对此有所了解!
jakarta-ee - 如何在 glassfish 4 上使用 truevfs META-INF/服务
我试图从部署在 glassfish 4 上的应用程序中使用truevfs库。如果在独立的 java-se 应用程序中使用下面的代码,它的效果非常好,但是当从 glassfish 内部使用时,它无法查找文件系统提供程序。
这应该工作吗?我有什么选择?
编码:
绒球:
和错误:
java - Jetty 中的 ServiceLoader 问题
我正在开发一个应该能够在运行时加载插件的 Web 应用程序。我知道 OSGi 将是一个优雅的解决方案,但由于使用了 GWT,我看不到向 OSGi 的过渡。
为了实现插件,我有 3 个 jar:应用程序、pluginAPI:
和 plugin.jar
plugin.jar 和 web-application 依赖于 pluginapi.jar。在应用程序中,我使用单独的 URLClassloader 加载每个 jar 文件,因此可以单独卸载它们。
现在,当且仅当我在应用程序服务器之外运行代码时,上面的代码片段就像一个魅力。我们正在使用 Jetty 在 netbeans 中调试 GWT,并且应用程序部署在 Tomcat 上(两者都显示相同的行为)。只要我在应用程序服务器中运行代码,代码就会在 ServiceLoader.java 中失败:
调试显示,插件和界面都已加载,在我看来是正确的,否则 Class.forName 会失败。同样,如果没有应用程序服务器,这不会发生。服务信息位于 META-INF/services/xx.xx.pluginapi.NotificationPlugin
我的直觉告诉我,该错误与应用程序服务器使用 ClassLoaders 的方式有关,但我和谷歌没有找到任何参考资料。有谁知道如何克服这个问题?非常感谢您的帮助!
java - java.util.ServiceLoader 是否仅加载服务的单个实例
我想问是否ServiceLoader.load()
可以帮助我创建加载服务的多个实例?
我一直在做一些测试,它似乎一次只能加载一个服务实例。如果可以有多个实例,有人可以解释我如何实现这一目标吗?