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

12

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

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

我们有7个Web模块,包括基于Struts2Spring 3.1的Web项目。一个基于JAX-WSSpring 3.1Webservice核心。

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

如果需要的话,我们肯定会使用MavenOSGi。我想到了一些东西

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
这是我个人的想法,但我们正在寻找更好的模块化方法,以便在不影响其他模块和主项目 WebProject.war 的情况下工作和部署 WebModule1.jar。同时,我们希望专业团队只拥有其项目的代码,因此,如果一个团队只需在其IDE中使用 Service2.jar,则他们只会拥有 Service2.jar 的代码以及已编译其他项目的资源项目。
谢谢

你的“全国性公司”让我很好奇。是哪个国家? - Neil Bartlett
哈哈!一个人口比多米尼加共和国佛罗里达州还少的国家。 - Garis M Suero
5个回答

9
模块化的关键在于模块尽可能地知道得少,这样它就可以在许多不同的上下文中重复使用。只有当假设被违反时才会出现错误,减少假设是最大的错误杀手。OSGi提供了像µservices这样的工具,非常擅长允许假设保持本地。
你的布局看起来非常像一个Web项目,我认为这是错误的,因为我们必须自己开发的大部分代码应该独立于用于呈现它的技术。所有这些技术很可能在不久的将来发生改变,因为Web应用程序正在迅速转移到浏览器,浏览器又再次成为了“胖客户端”。也就是说,非常现代的REST接口已经感觉非常过时,如果你看到纯消息传递正在做什么。所有这些波动意味着您希望使您的模块尽可能解耦。
所以,我永远不会将任何域代码与与Web技术相关联的任何内容耦合起来。这些传递性依赖关系将在(不久的)未来伤害您。构建小而紧密的解耦模块,然后将它们用作乐高积木来构建应用程序。

6
我强烈建议阅读Kirk Knoernschild"Java Application Architecture: Modularity Patterns with Examples Using OSGi"。在迁移到OSGi之前,您可以开始对应用程序进行模块化(如果您还没有好的测试覆盖率,那么一定要投资)。如果您正在使用Servlet规范3.0,则应考虑使用Web片段。就您展示的结构而言,除了Web片段之外,我建议不要嵌套任何内容,WAR可以成为WAB(Web应用程序包 - 基本上是瘦WAR)。此外,请尽可能利用OSGi的μServices - 那里才有乐趣=)企业级OSGi框架(如Karaf和Virgo)在您跨越JEE-OSGi界限时提供了很多支持(Equinox和Felix本身有点简陋)。

1
这个问题的答案都在书的链接里,是一个很好的资源,谢谢。 - gersonZaragocin
1
@gersonZaragocin,同意 - 我特别喜欢它讨论模块化原则的事实,而不强制使用OSGi..(但确实指出了OSGi的优越性) - earcam

1

根据您的项目要求,如独立模块开发和运行时更新,Maven是最佳解决方案。它提供了很好的依赖和插件支持,并且似乎您项目所需的一切都已经可用:

  • Spring/Struts/CXF等Maven构件,
  • WAR/JAR等插件,
  • 应用服务器部署/测试插件等。
  • 并且您可以为仅开发特定模块的团队提供常见的Maven构件,而无需共享所有代码库。
  • Maven受所有持续集成服务器(Hudson/TeamCity等)支持。

OSGi。如果您想使用它,您必须仔细查看当前的设计,并尝试将其适应于μServices。通常,您将具有带有API、API消费者和API提供者的模块。这有助于您在团队之间更好地分割开发(例如,一个团队开发API消费者模块,另一个团队开发API提供者模块)。如果需要,您可以将API消费者/提供者模块拆分为2个或更多OSGi捆绑包(即Maven模块)。


0

你的结构看起来很好,这是大多数项目的典型结构。我建议你对依赖进行版本控制,例如让你的webproject.war依赖于webmodule1-1.3,这样不同的最终项目可能会有不同版本的依赖jar包。

使用Maven肯定会简化管理这些依赖关系。

如果你的要求是在运行时替换依赖项,那么你需要选择像OSGI这样的技术,但是如果你不是在寻找运行时模块化,我建议不要从OSGi开始,保持堆栈更简单。


如果您喜欢保持简单,我建议从OSGi µservices开始,而不是包含当今庞大的Web堆栈... - Peter Kriens

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接