方法
可能从一个玩具应用程序开始,一个 WAB (OSGi WAR) 和单个服务包。
绝对采取迭代的方法。据我所知,JBoss 支持 OSGi 服务和 Java EE 的混合,通过 JBoss modules/msc,这将允许您尝试 OSGi 并逐步迁移。
我认为您会发现有些事情非常容易,有些则非常困难,所以在熟悉的同时选择简单的战斗。最后,您可能会坚持使用混合方法。
建造
你的构建工具是什么?主要像 Maven 或 Ant,在这种情况下,请分别查看maven-bundle-plugin
或bnd。您需要确保 OSGi 元数据存在于每个包中(Bundle-SymbolicName、Import-Package、Export-Package 等)。如果您使用的是 Maven,请参阅此答案。
将单体应用程序划分为模块可能很棘手,但作为一般规则,当您迁移一个合理大小的模块时,您应该为 API 和实现提供单独的捆绑包(无论如何这是一个好的设计,但对运行时也有影响)。
互操作
您可以使用从注入的低级框架 API 获取 OSGi 服务、访问包等BundleContext
,这将为您提供进入 OSGi 的低级编程挂钩。它应该很简单:
@Resource
BundleContext context;
除非您的 Java EE 代码被打包为 JBoss 模块,否则我认为如果不求助于 JNDI 之类的东西,您很难以其他方式调用(例如 OSGi 服务查找 Java EE 服务)。
您应该能够安装 web 控制台并查看在 OSGi 中注册了哪些 Java EE 位,并类似地检查 JNDI 以查看 Java EE 的可用 OSGi。
迁移服务
虽然 OSGi 很有趣,但使用原始框架 API 会产生相当多的样板代码,而且您不太可能需要强大的功能或想要耦合。您可以在 OSGi 之上使用许多依赖注入框架;blueprint(类似 Spring)、Peaberry(Guice)和声明式服务。
我有偏见,但声明式服务对 OSGi µservice 模型有很强的亲和力,并且实现是轻量级的。
CDI
我对 Seam/CDI 了解不多,但Pax CDI可能会有所帮助(尽管 JBoss 可能已经涵盖了这一点)。
网络
您是否计划拥有一个高度模块化的 UI,并热部署各种组件?如果不是,那么最好将 UI 打包为 WAB。WAB 是一个瘦 WAR(即它导入而不是嵌入大多数依赖项)。即使您追求高度模块化、动态的前端,我也肯定会在第一遍就这样做。
JPA
一个警告 - JPA 实现通常在 OSGi 环境中不能很好地发挥作用,您可能想看看 Apache Aries 或 Eclipse Gemini。另一种选择可能是将 JPA 内容留在 Java EE 空间中,并将 Java EE DAO/存储库作为 OSGi 服务访问。同样,尽管您可能会遇到一些类加载问题。
可能有用的例子https://docs.jboss.org/author/display/JBOSGI/Provided+Examples