大型企业Java应用程序-模块化

大型企业Java应用程序-模块化,java,jakarta-ee,web-applications,module,osgi,Java,Jakarta Ee,Web Applications,Module,Osgi,我在一家全国性的公司工作,所以我们开发的软件规模很大 我们的核心系统是基于Web的,包括webservices。我们目前正在重新设计整个项目,现在正是开始项目结构的时候 我们有7个web模块,包括基于Struts2和spring3.1的web项目。基于JAX-WS和spring3.1 我的问题是,对于这样的项目,设计项目结构和模块化的最佳实践是什么: 如果需要,我们肯定会使用Maven和OSGi。我在想类似的事情 WebProject.war |---Web.xml |--- Lib

我在一家全国性的公司工作,所以我们开发的软件规模很大

我们的核心系统是基于Web的,包括
webservices
。我们目前正在重新设计整个项目,现在正是开始项目结构的时候

我们有7个web模块,包括基于
Struts2
spring3.1
的web项目。基于
JAX-WS
spring3.1

我的问题是,对于这样的项目,设计项目结构和模块化的最佳实践是什么:

如果需要,我们肯定会使用
Maven
OSGi
。我在想类似的事情

WebProject.war
   |---Web.xml
   |--- Libs
   |
   |--- Web Module1.jar
   |--- Web Module2.jar
   |--- Web Module3.jar
   |--- Web Module4.jar
   |--- Web Module5.jar
   |--- Web Module6.jar

 WebService.war
   |---Web.xml
   |--- Libs
   |
   |--- Service.jar
   |--- Service2.jar

 EJBProject.jar
   |
   |--- module.jar
   |--- module2.jar
这是我个人的想法,但我们正在寻找更好的模块化产品,以便在不影响其他模块和主项目的情况下工作和部署
WebModule1.jar
。同样,我们希望专业团队只拥有他们项目的代码,因此如果一个团队必须在他们的
IDE
中只使用
Service2.jar
,那么他们将只拥有
Service2.jar
的代码,以及一个已经编译的资源项目


谢谢

我强烈推荐雷丁的。在迁移到OSGi之前,您可以先对应用程序进行模块化(如果您还没有良好的测试覆盖率,我肯定会进行投资)

如果您使用的是servlet spec 3.0,那么看看如何使用web片段

就您展示的结构而言,我要说的是不要嵌套任何东西(除了web片段),战争可以变成WABs(web应用程序包-基本上是一场骨瘦如柴的战争)。同时尽可能多地利用OSGi的μ服务——这就是乐趣的开始=)


Karaf和Virgo等企业OSGi框架在跨越JEE-OSGi鸿沟时提供了大量支持(Equinox和Felix本身就有点露骨)。

我认为您的结构不错,这是大多数项目的典型结构-我建议您对依赖项进行版本化,例如,让您的webproject.war依赖于webmodule1-1.3,也就是说,通过这种方式,可能不同的最终项目可能具有不同版本的依赖JAR

使用maven肯定会简化对这些依赖项的管理


如果您的需求是在运行时替换依赖项,那么是的,您将不得不使用OSGI之类的技术,但是如果您所寻求的不是运行时模块化,我建议不要从OSGi开始,让堆栈更简单。

基于您的项目需求,如独立模块开发和运行时更新,Maven是最好的解决方案。它提供了对依赖项和插件的强大支持,看起来您的项目所需的一切都已经就绪:

  • 弹簧/支柱/CXF/等maven工件
  • WAR/JAR等插件
  • 应用服务器部署/测试插件等
  • 对于只开发特定模块而不共享所有代码库的团队,您只能提供公共maven工件
  • Maven由所有持续集成服务器(Hudson/TeamCity等)支持

奥斯基。如果您想使用它,您必须仔细查看当前的设计,并尝试使其适应μ服务。通常,您将拥有带有API、API使用者和API提供者的模块。它更能帮助您在团队之间划分开发(例如,一个开发API使用者模块,另一个开发API提供者模块)。如果需要,可以将API使用者/提供者模块拆分为2+OSGi捆绑包(即Maven模块)

模块化的关键方面是,您的模块尽可能少地了解人类的知识,因此可以在许多不同的环境中重用。错误只有在违反假设时才会发生,最小化假设是最大的错误杀手。OSGi提供了像µservices这样的工具,这些工具在允许假设保持本地性方面非常好

您的布局看起来非常像一个web项目,这是错误的,因为我们必须自己开发的大多数代码应该独立于用于呈现它的技术。所有这些技术在不久的将来都可能发生变化,因为web应用程序正在迅速转向浏览器,浏览器再次成为胖客户端。也就是说,如果您了解纯消息传递的功能,那么非常现代的REST接口已经感觉非常过时了。所有这些波动性意味着您希望使您的模块尽可能地解耦


因此,我决不会将任何域代码耦合到任何与web技术耦合的库。这些可传递的依赖关系将在不久的将来伤害您。构建小型内聚的非耦合模块,然后将它们用作乐高积木来构建应用程序。

在处理了OSGi之后,我们为Spring开发了OSGi较少的模块化功能。您很好

对你的“全国性公司”感到好奇。哪个国家?哈哈!一个人口比多米尼加共和国佛罗里达州少的国家。如果你想让事情变得更简单,我将从OSGiµ服务开始,不包括今天网络世界中庞大的堆栈…书籍链接提供了这个问题的所有答案,很棒的资源,thanks@gersonZaragocin,同意-我特别喜欢它讨论模块化原则而不强制OSGi。。(但确实指出了OSGi有多棒)