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

java - java加载模块中的服务加载器,但可以正确显示加载的视图

所以我的应用程序有一个主项目,它加载所有实现 IModule 的类。每个模块都有一个扩展 AbstractView 的视图。这是示例代码

它只是简化的示例,但这几乎就是它的工作原理。我的问题是我无法显示插件视图。我不知道为什么这不起作用。当我打印加载的视图时,我得到了扩展该 AbstractView 的类,其属性如布局类型等。实现与 UI 无关的接口的类似乎没有问题 atm。我从包含它们各自的 jar 文件的文件夹中加载插件。

编辑

在我的 META-INF/services 中,我只有 app.IModule 文件,其中包含文本 plugin.Plugin。插件类是实现 IModule 的类。这是我声明的唯一服务,因为它是服务加载器将加载的类。我是否也必须声明扩展 AbstractView 的类?即使没有在服务加载器中加载它

0 投票
1 回答
392 浏览

java - 使用 Serviceloader 的 Guice 在不使用注入器的情况下为插件创建类实例

我的核心应用程序已完成。我能够成功加载模块,但我仍然无法正确使用 guice 在我的模块中注入依赖项。我的核心应用程序使用服务加载器加载模块,并使用 guice 的 AbstractModule 的安装方法安装它们。这是一个示例代码:(简化)

每个模块都实现了 IModule 接口,该接口扩展了 guice 的 Module 接口。让我感到困惑的是,当不建议到处都有注入器时,我如何提供插件实例(例如视图实例)。我阅读了@Provides 注释,我认为这是一个可能的解决方案,但我面临的另一个问题是其中一些具有需要注入的依赖项。例如,我的 pluginview 注入了一个插件控制器的实例。鉴于这种情况,我不确定如何使用提供者接口。建议将不胜感激

0 投票
1 回答
31 浏览

java - 插件jar的图片资源使用问题

我目前正在开发一个支持插件的应用程序。插件位于名为 modules 的根文件夹中作为 jar 文件。我的主应用程序使用 java 服务加载器加载位于 modules 文件夹中的所有 jar

我的模块具有以下文件夹结构:

插件使用的图像存储在资源文件夹中。我的问题是无论我做什么,我似乎都无法加载这些图像文件。我已经尝试使用 getClass().getResource() 等,就像以前的帖子所建议的那样,但没有运气。任何人都可以提出一个可能的解决方案吗?

编辑

插件是加载资源的插件。主应用程序不接触插件的资源

0 投票
1 回答
456 浏览

java - ServiceLoader + EJB 注入

我想知道我是否可以将ServiceLoaderEJB 和 Java EE 6 的注入结合起来。

想象一下,我有一个ServiceI可以由两个 EJB 无状态 beanBeanABeanB.

如果我在其中注册这两个类,MEAT-INF/services它们将以 Java SE 方式实例化,而不是由应用程序容器管理(就像您使用 时一样@Inject)。这意味着注释喜欢@Inject@PostConstruct不会被解析。

是否有可能有类似 a 的东西,ServiceLoader它允许我通过 EJB bean 实现给定的接口并根据某些标准返回一个?

0 投票
1 回答
2043 浏览

java - Spring中是否有ServiceLoader的类似物以及如何使用它?

我试图找出ServiceLoader该类的 Spring 类似物是否是标准 SDK API 的一部分。如果有这样一个类,它是如何使用的?

请指教!

0 投票
1 回答
55 浏览

java - 如何创建一个使用来自提供者的组件的组合,它本身应该被添加到其中?

标题可能有点复杂,但我没有看到任何其他方式来表达我的问题。

我正在开发一个项目,其中通过加载几个文件并将它们转换为 Java 组件来初始化某些组件,而其他组件则由 ServiceLoader 加载,因为它们已经作为 Java 类存在。然后,所有这些对象都由提供者映射,以便可以从那里检索它们。

我现在要直接在 Java 中添加更多组件,但它们更多是复合的,这意味着它们使用以前加载到提供程序中的组件。因此,我必须从提供者那里收集所需的组件,将它们添加到组合中,然后将组合本身添加到提供者中。

只需将复合材料添加到特定的 META-INF 文件即可将复合材料添加到 Provider。然后它将由 ServiceLoader 处理。

对我来说,这在某种程度上是一种循环依赖。我必须在 META-INF 文件中定义 ServiceLoader 应该收集哪些 Java 类。这也将包括新实施的复合材料。但是,只要提供者已加载所有其他指标,就无法创建该指标。

有什么模式或不同的方法可以用来解决这个问题吗?

0 投票
2 回答
2057 浏览

java - 使用 Java ServiceLoader 结果 NoSuchElementException 错误

我的 DoFindMiddleService 类扩展了抽象类 DoFindMiddle。这是 DoFindMiddle 类:

这是 DoFindMiddleService 类的第一部分:

如果我在单元测试中尝试以下操作:

然后它正在工作。但是当我在单元测试中尝试时:

然后它会导致 NoSuchElementException 错误。我有什么错?

我的 pom.xml 如下:

当我尝试执行时,出现此错误:

0 投票
1 回答
1672 浏览

java - 如何使外部库的 Java serviceLoader 工作

我正在为第三方软件开发一个没有文档的插件。对于插件,我使用由 maven 管理的外部库(.jar),稍后在 tomcat 服务器上执行。一切都很好,直到我更新到最新版本的库,现在使用 java.util.serviceLoader 来加载接口的具体实现。构建时,我的项目在 tomcat 服务器上有这个包结构:

如您所见,外部库具有正确的服务条目,这是 serviceLoader 在 META-INF 中找到接口的具体所必需的。该 full.path.to.TheFactoryInterface文件的内容是full.path.to.TheConcreteClass,这似乎是合法的。

但是,我的插件(包和核心)没有任何这些 META-INF 信息。

现在发生的情况是,每次我的插件使用会触发外部库的 serviceLoader 的方法时,serviceLoader 都找不到具体的实现。

我已经尝试过将完全相同的内容添加services/full.path.to.TheFactoryInterface到我的所有 META-INF 目录中,但这不起作用(我想我需要更改 full.path.to.TheFactoryInterface 文件的内容,但我不确定 - 因为3rd 方软件的未记录插件结构 - 正确的(相对)路径是什么样的)。

谁能给我一个镜头我在这里做错了什么以及如何解决它以便serviceLoader找到具体的类?包含内容的服务文件夹应该放在哪个 META-INF 文件夹中,我应该更改路径吗?这是完全错误还是我错过了完全不同的东西?

我知道这是一个非常特殊的主题,因为第 3 方软件是未知的,但是任何取决于 serviceLoader 的信息及其在具有多个 META-INF 文件夹和不同执行上下文/类路径的多个 jar 中运行时的行为都会受到赞赏。

0 投票
1 回答
193 浏览

eclipse - Service Loader 配置文件没有正确展开

所以我正在 Eclipse 中编写一个 webapp,我想在我的一个类中使用服务加载器。问题是在哪里放置 META-INF/services 的东西。从这里(https://stackoverflow.com/a/3421191/2742995)我发现:

但理想的方法是将它放在插件的 jar 文件中。例如,如果您有一个捆绑为 WEB-INF/lib/myplugin.jar 的插件,并且您的插件类是 com.example.plugin.MyPlugin 那么 jar 应该有一个结构:

所以我在包含 serviceloader 东西的模块中,来源: src/main/java/ 包含

  1. vcs.validation.*(包含源代码)
  2. 一个文件夹: META-INF/services/vcs.validation.javatests.JavaTest 包含:

    • Test1(读取 vcs.validation.javatests.Test1)和
    • Test2(读取 vcs.validation.javatests.Test2)

(接口vcs.validation.javatests.JavaTest有两个实现类Test1和Test2)

但是,当我将整个 webapp 打包为一个 war 并在 tomcat 中部署时,web-app/WEB-INF/classes/ 文件夹不包含任何 META-INF/services/。我在这里做错了什么?

0 投票
4 回答
5843 浏览

java - 在 Java 中,如何模拟使用 ServiceLoader 加载的服务?

我有一个遗留 Java 应用程序,其中包含类似这样的代码

我想提供 SomeInterface 的模拟实现供此代码使用。我使用 mockito 模拟框架。

不幸的是,我无法更改遗留代码,并且我不希望静态添加任何内容(例如,向 META-INF 添加内容)。

有没有一种简单的方法可以在测试中做到这一点,即。在测试运行时?