【问题标题】:Creating a moddable application with OSGi使用 OSGi 创建可修改的应用程序
【发布时间】:2015-01-29 21:30:18
【问题描述】:

我一直在网上搜索一个关于我将要描述的内容的好教程的链接,但我还没有找到它。我希望这里的人已经知道在哪里可以找到它并可以在此处发布指向它的链接。

我想知道如何使用 OSGi/Equinox 构建一个应用程序(游戏、业务或其他),以允许稍后添加未知内容的库。

这个想法从我第一次使用 Minecraft Forge 时就让我着迷,我所要做的就是将 JAR 放到一个可能被标识为类路径或其他东西的 mods 目录中。

我首先在 .NET 中研究了该主题,并在“System.AddIn”和“System.AddIn.Contract”库中找到了合适的响应。这里有一个很好的教程:MSDN - Creating an Extensible Application。这工作得很好。您创建一个定义插件类型的接口和协定的管道,然后只需将类库放到正确的目录中,就可以稍后添加插件。

我现在正在积极研究如何在 Java 中做同样的事情,我目前正在研究 OSGi 插件。但是,到目前为止,我遇到的所有示例都集中在设计时已知的捆绑包上。而且,还有“DynamicImport-Package”的对话,但是目前看到的资源对这个不以为然。

所以问题是,有没有人知道一个资源,它讨论了一种“微笑”的方法,用于动态发现和加载满足特定接口的未知捆绑(类库)?

【问题讨论】:

    标签: java eclipse plugins osgi equinox


    【解决方案1】:

    您正在寻找 OSGi 服务。在 OSGi 中,您可以在一个包中注册服务并在另一个包中使用这些服务。您还可以跟踪出现在 OSGi 容器中的服务,并在它们满足您的需求时使用它们。

    NET 上有很多教程解释了如何使用 OSGi 服务。例如:http://www.knopflerfish.org/osgi_service_tutorial.html

    如何使用它的示例:

    • 您指定一个接口
    • 每个插件包都必须有接口的实现,并且包将实例化的对象注册为 OSGi 服务。
    • 您的技术包(可以包含插件)跟踪实现该接口的所有 OSGi 服务。

    【讨论】:

    • 太棒了!我要看看你发布的文章。我应该能够在接下来的 24 小时内给出可靠的答复。
    • 我想为事后阅读此内容的任何人添加此链接:docs.oracle.com/javase/tutorial/ext/basics/spi.html
    • OSGi 服务比 SPI 更加灵活和模块化。此外,SPI 在 OSGi 中不起作用。您将遇到类加载器问题,并且您将没有机会动态配置所提供的服务。
    • 我很感激。我想尝试一下 OSGi,但我想先在 SPI 沙箱中玩一下,因为我认为它的学习曲线更快,一些对话相似,并且有一定程度的可转移知识。我将这篇文章标记为“答案”,因为它是我所说的问题的正确答案,但我想知道 SPI 现在是否不是我的正确选择。
    【解决方案2】:

    将 OSGi 框架嵌入到您的应用程序中然后动态加载要加载的 OSGi 捆绑插件库的主要 OSGi API 是 org.osgi.framework.launch.Framework。您可能会发现在此上下文中查看我感兴趣的 https://github.com/vorburger/ch.vorburger.minecraft.osgi/ 项目的源代码:它将 Apache Felix OSGi 框架嵌入到 Minecraft Sponge 模块中,并动态加载其他 Minecraft 模块作为 OSGi 包 - 几乎就是您所要求的? ;-) 看看OSGiFrameworkWrapper 类。您也可以在不使用 OSGi 的情况下执行此操作并自己使用 java.lang.ClassLoader,或者使用我的 https://github.com/vorburger/HoTea 项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-08
      • 2011-11-08
      • 2017-05-09
      • 2013-03-21
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多