我正在开发一个媒体应用程序,用户应该能够在运行时从中央数据库动态加载工具。这些将主要是用于操纵音频和视频的信号处理模块。我一直在阅读有关实现自定义类加载器的内容,但似乎必须知道类的名称才能使用classLoader。这对我来说似乎不对。我希望能够在部署应用程序之后构建这些模块(并且可能为其创建开放公共API)。
我在考虑要求模块扩展一个实现接口的抽象类:
public abstract class AbstractModule implements myInterface{
//....
}
我仍然无法知道这些模块的作者将这个子类命名为什么......
我已经阅读了一些关于osgi bundle的内容,这看起来很有希望...但是我显然不想重新设计我的整个架构......是否有可能让我的应用程序的这部分使用Osgi捆绑包?我的感觉是否定的,因为似乎Osgi捆绑包需要自己的容器才能运行。
无论如何,让我的applcation动态加载模块的最好,最少hacky和最稳定的方法是什么。模块需要某种标准化(比如扩展抽象类)。
由于
答案 0 :(得分:3)
当然,我不同意其他答案。
此外,您的一个担忧似乎是有必要拥有一个OSGi容器。这是真的:Felix(APLv2),Equinox(EPL)和Knopflerfish(BSD)是开源OSGi框架实现的示例。然而,它们非常轻巧且可嵌入,实际上您可以使用大约5-10行代码嵌入它们。我刚才在这个问题上写了blog post,这可能有助于你开始。
换句话说,没有必要将整个应用程序转换为OSGi(尽管您可能希望出于其他原因,例如模块化和可维护性)。您可以在应用程序中创建一个小型OSGi容器,该容器仅用于加载这些可插入工具。
其他一些杂项:
答案 1 :(得分:1)
对于OSGI来说,这是一个非常漂亮的用例。所以我想问题是 - 这是桌面应用程序还是服务器?请注意,可以在桌面上使用OSGI,但是如果你走这条路线,你的容器选择会有所不同。
修改强>
对于桌面应用程序,您最好使用Felix或Eclipse Equinox。两者都可以很好地嵌入到独立的富客户端中。对于服务器应用程序,我不能足够推荐JBoss 7。您将获得一个快速的Java EE 6服务器,它具有对OSGI模块的一流支持。我仍然不确定你的架构的确切设置,你提到了(丰富的声音)客户端和Java EE服务器。你能详细说明一下吗?
答案 2 :(得分:1)
我同意@Perception - 您应该考虑OSGi。重新发明轮子毫无意义。但如果你别无选择:
创建每个模块需要实现的标准化接口,例如
public interface ModuleInterface {
public String greet(String name);
}
模块的实现可能如下所示:
public class MyModule implements ModuleInterface {
@Override
public String greet(String name) {
return "Hi "+name+"!";
}
}
然后,您可以将这些类打包在一个jar(未密封)中以创建模块。您的应用程序(包括公共ModuleInterface类)可以通过执行此操作来加载模块。
URL classUrl = new URL("file:///modules/server/ModuleJar.jar");
URL[] classUrls = {classUrl};
URLClassLoader ucl = new URLClassLoader(classUrls);
Class<?> clazz = ucl.loadClass("com.example.MyModule");
ModuleInterface firstModule = (ModuleInterface)clazz.newInstance();
System.out.println(firstModule.greet("John Doe"));
答案 3 :(得分:0)
您需要扫描类路径并按类检查 这是一件非常讨厌的事情 检查Reflections,它将帮助您获得某种类型的所有子类型而无需太多工作
答案 4 :(得分:0)
正如其他人所说,这是OSGi的一个可爱的用例。未提及的一件是OSGi服务。服务在服务注册表中注册,并通过接口名称进行查找。如果有多个服务实现相同的接口,则可以返回包含所有这些接口的列表。
您可以以编程方式注册和访问服务,但最好使用声明性服务或蓝图以声明方式进行。两者都为OSGi服务提供简单的依赖注入。蓝图基于弹簧dm,所以如果你习惯弹簧,它应该看起来很熟悉。如果你正在使用Glassfish我相信它有一个不同的系统来注入OSGi服务,所以你可以使用它或在你的容器中安装蓝图实现。
许多应用程序服务器(包括Glassfish,JBoss,Geronimo和WebSphere Application Server)允许您在OSGi容器中运行应用程序,同时仍使用servlet和JPA等Java EE模式。 (如果你想谷歌更多,Glassfish称这个混合应用程序,这给你的想法,而其他人称之为企业OSGi。)这可能允许你转移到一个很好的干净的OSGi解决方案实现,而无需重大的重新构建。
-
Enterprise OSGi in Action:http://www.manning.com/cummins