Java 构建一个应该在OSGI和非OSGI环境下工作的库的好方法是什么?

Java 构建一个应该在OSGI和非OSGI环境下工作的库的好方法是什么?,java,osgi,equinox,Java,Osgi,Equinox,我正在编写一个在OSGI环境中运行的应用程序。 现在,我想提取一些代码并将其放在单独的bundle/jar文件中,以便在其他应用程序(OSGI或非OSGI)中重用它 我的目标是删除对OSGI环境类的任何依赖关系,因为它还应该在其他应用程序中运行,这些应用程序没有各种OSGI框架的所有JAR(例如Equinox)。但同时,如果应用程序是OSGI应用程序,我想在OSGI环境中注册一个OSGI服务 我已经分离了代码,目前唯一剩下的依赖OSGI的代码是我的Activator类,它将某个类注册为OSGI服

我正在编写一个在OSGI环境中运行的应用程序。 现在,我想提取一些代码并将其放在单独的bundle/jar文件中,以便在其他应用程序(OSGI或非OSGI)中重用它

我的目标是删除对OSGI环境类的任何依赖关系,因为它还应该在其他应用程序中运行,这些应用程序没有各种OSGI框架的所有JAR(例如Equinox)。但同时,如果应用程序是OSGI应用程序,我想在OSGI环境中注册一个OSGI服务

我已经分离了代码,目前唯一剩下的依赖OSGI的代码是我的Activator类,它将某个类注册为OSGI服务:

context.registerService(MyServiceInterface.class.getName(), new MyServiceImpl(), new Hashtable());
为了消除依赖关系,我考虑以下几点:

  • 我从bundle 1中删除Activator和OSGI依赖项
  • 我创建另一个bundle2,在其中移动激活器
最后,我有了bundle1.jar,它只有一个Manifest.mf文件来准备OSGI,但是已经没有依赖于OSGI框架类的代码了。 我有另一个bundle,它只属于我当前的应用程序,它导入bundle1.jar,唯一的目的是使用激活器在OSGI容器上注册MyService.class

  • 这种方法行吗,或者还有其他最佳实践吗
  • 在OSGI环境中注册服务是一种良好的做法,还是主机应用程序应该始终负责这一点
    在大多数情况下,您可以在不使用Activator的情况下发布服务。看看和。

    为什么不把activator类留在包中呢。在非OSGi环境中运行时,不会调用activator类。在OSGi环境中运行时,它将。将OSGi依赖项与activator隔离是一个很好的策略。

    另一种方法是使用blueprint。至少在简单的情况下,它允许对OSGi完全没有依赖关系。对于实际情况,您通常至少需要一些OSGiAPI,但在非OSGi情况下,让它们处于非活动状态是没有问题的


    你也可以试试。它允许在OSGi之外使用激活器和OSGi服务。我们开始在Apache Camel中使用它来测试OSGi代码。

    使用Spring DM将有助于消除对OSGi的代码依赖性。您的捆绑包不需要激活器,并且可以从SpringDM配置xml导出服务。但是,这确实增加了更多的运行时依赖项,但不需要编译依赖项。

    这种方法的问题是,Activator为org.osgi.framework.BundleActivator和org.osgi.framework.BundleContext提供了导入语句,这将导致非osgi环境中的编译错误。这就是我试图避免你说你甚至不想在你的构建路径上有OSGi库??为什么不呢,费用是多少?我理解从您的运行时依赖项中删除OSGi…嗯,我还没有考虑过这一点。那么这样做是有效的做法吗?我可以这样做,因为我们的构建路径确实有这些依赖项(当前使用pde构建)。我计划在github上以库的形式发布它,提供一个maven pom.xml,这就是为什么我考虑让它对于非osgi应用程序尽可能轻量级的原因。但这是我的第一个开源版本,我第一次考虑这类事情。如果包中所有OSGi api的使用都局限于activator类,并且该类没有被其他任何人使用,那么jar的使用者应该能够根据jar进行编译,而不需要类路径上的OSGi api jar。显然,如果有人想为您的jar重新编译源代码,他们将需要类路径上的OSGi API jar来编译您的activator类。是的,声明性服务方法可能是这里最好的方法。在我的情况下,我还不想切换到DS,因此我将从我的服务包中删除Activator,并拥有另一个包含Activator的包。这样,我的服务包就完全独立于OSGI,除了Manifest.MF和一些包导入和导出定义。如果使用maven,您可以只设置OSGI框架依赖项的范围以提供。这听起来很糟糕,因为它需要导出服务实现类(MyServiceImpl)?我的选择是使用DS XML文件…@PeterKriens对,这很糟糕。嗯,我想我需要调查DS。看看spring dm和白羊座蓝图。