我是否需要提供自定义ClassLoader?大声思考这似乎不是正确的方法,因为在类加载器中,人们不知道所需的版本。
答案 0 :(得分:3)
鉴于加载机制基本上与URL一起使用,我建议 尝试自定义URL处理程序。从逻辑上讲,你需要在使用这个处理程序加载任何包之前加载并激活它,否则我认为它应该可以工作。
请参阅“R4处理器服务规范”,R4 OSGi核心规范。
Glassfish is using this approach to install webapp bundles btw。
答案 1 :(得分:2)
一个简单的解决方案是创建自己的引导包,它将从数据库(或其他位置)配置所有其他包。 OSGi允许您从任意InputStream
安装捆绑包,因此将其插入您想要的任何源(例如JDBC)应该相当容易。
有关详细信息,请参阅BundleContext.installBundle()
方法。
你不应该寻找一个“回调”,框架会通过它“通知你何时需要加载一个必需的依赖”,因为自动依赖管理(ala Maven)不是核心OSGi功能的一部分(虽然可以通过使用OBR)等服务实现。
答案 2 :(得分:1)
查看PAX URL项目:http://wiki.ops4j.org/display/paxurl/Documentation
这证明了加载OSGi包的关注点与存储方式的分离。从理论上讲,我认为使用数据库作为捆绑存储没有任何重大障碍,但我也没有看到任何明显的优势。
对于捆绑软件版本,您需要一些机制来识别要加载的捆绑包(和版本)。您可以使用版本信息将捆绑包存储在数据库中,否则如何存储同一捆绑包的不同版本?
答案 3 :(得分:0)
您可以随时将它们从数据库(或其他)下载到某个本地位置,然后将它们动态安装到OSGi Framework中。您需要为框架提供的只是bundle的文件系统路径。当然,您必须自己编写所有胶水代码。另一方面,如果您使用的是Eclipse P2,则可以通过自动配置来获得更大的灵活性。