简单的Java服务发现框架

8
我想在Java应用程序的运行时发现接口的所有实现,并从用户可以添加到文件夹中的JAR文件动态加载这些类。基本上这是一个插件系统。
我找到了一些解决方案:
- 使用SPI - 这不是非常灵活:我希望找到一些可能与注释一起使用的东西,或者只是查找扩展的接口,而无需添加外部文本文件。 - 使用Commons Discovery - 看起来像是死路一条,因为最后发布的版本是2005年的0.4版。 - 使用Java Simple Plugin Framework. 5分钟即可运行。没有XML。 - 这看起来非常不成熟。
还有其他广泛使用的解决方案吗?
更新:现在不需要代码分离,OSGi对我的简单需求似乎过于复杂。我还在问题标题中添加了“Simple”以澄清我的意图。

OSGi可以解决这样的问题,并且提供了保持模块分离等方式,如果您有插件依赖于其他库,则这将非常重要。 - Jesper
4个回答

4

虽然有点庞大,但你应该考虑使用Apache FelixEclipse Equinox,它们都是OSGi实现,非常活跃,但可能对您的需求来说过于繁琐。不过,这正是OSGi设计旨在解决的问题之一。


1
你可以尝试使用Apache River(前身为Jini)的服务发现功能。

http://river.apache.org/

它通过远程接口发现服务并为您下载代理,通常是RMI存根。

0

像 @skaffman 所说的,OSGi和基于它构建的现代实现似乎是一个完美的解决方案。如果你在使用guice,可以考虑 iPOJO,它完美地将注释纳入了OSGi堆栈中(注意iPOJO适用于任何OSGi平台)。如果你更倾向于XML/Spring,可以考虑使用Blueprint

最后,关于JSPF,我不会分享你对其不成熟的看法。在那个项目上有一点合作经验后,我发现它在其领域真的很有用,因为它允许轻松地使用插件,而无需OSGi提供的麻烦和类路径分离。


你能否提供一个JSPF的简单示例链接?我正在尝试使用该框架,但我真的不理解Options功能是如何工作的。 - capovawi

0

+1 SPI -- 它是轻量级的,需要一些维护(services/*文本文件),但由于Java的类加载器工作方式,任何“自动发现”都不会100%可靠;您可以通过一个简单的程序来减少文本文件的麻烦,在给定的项目/目录中生成和/或(我建议)测试所有实现是否已包含

+2 OSGi -- 如果您愿意采用轻量级方案,并且注意到实现变得更加轻便和易用(至少其中一些!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接