12

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

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

我们有 7 个 Web 模块,包括基于Struts2Spring 3.1. Webservice基于JAX-WS和的核心Spring 3.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不影响其他模块和主项目的情况下工作和部署WebProject.war。同样,我们希望专业团队只有他们项目的代码,所以如果一个团队必须只Service2.jar在他们的项目中工作,IDE他们将只有代码Service2.jar和资源项目与其他项目已经编译。

谢谢

4

5 回答 5

9

模块化的关键方面是你的模块知道的尽可能少,以便它可以在许多不同的上下文中重用。错误仅在违反假设时才会出现,最小化假设是最大的错误杀手。OSGi 提供了像 µservices 这样的工具,这些工具非常好地允许假设保持本地化。

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

因此,我永远不会将任何域代码耦合到任何耦合到与 Web 技术耦合的库的代码。这些传递依赖将在(不久的)将来伤害你。构建小的内聚解耦模块,然后将它们用作乐高积木来构建您的应用程序。

于 2012-04-20T07:37:49.297 回答
6

我强烈推荐阅读Kirk Knoernschild“Java 应用程序架构:模块化模式和使用 OSGi 的示例”。在迁移到 OSGi 之前,您可以先模块化应用程序(如果您还没有它,我肯定会投资于良好的测试覆盖率)。

如果您使用的是 servlet 规范 3.0,请查看使用 web-fragments。

就您展示的结构而言,我想说不要嵌套任何东西(网络片段除外),WAR 可以成为 WAB(网络应用程序包 - 基本上是一个瘦 WAR)。还尽可能多地利用 OSGi 的 μServices - 这就是乐趣开始的地方 =)

当您跨越 JEE-OSGi 鸿沟时,像 Karaf 和 Virgo 这样的企业 OSGi 框架提供了很多支持(仅 Equinox 和 Felix 就有点像准系统)。

于 2012-04-19T10:05:33.603 回答
1

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

  • 弹簧/支柱/CXF/等。Maven工件,
  • WAR/JAR/等。插件,
  • 应用程序服务器部署/测试插件等。
  • 您可以只为只开发特定模块而不共享所有代码库的团队提供常见的 Maven 工件。
  • 所有持续集成服务器(Hudson/TeamCity 等)都支持 Maven

操作系统吉。如果您喜欢使用它,您必须仔细查看您当前的设计并尝试使其适应 μServices。通常,您将拥有带有 API、API 消费者和 API 提供者的模块。它可以帮助您更多地在团队之间拆分开发(例如,一个开发 API 消费者模块,另一个 - API 提供者模块)。如果需要,您可以将 API 使用者/提供者模块拆分为 2+ 个 OSGi 包(即 Maven 模块)。

于 2012-04-19T14:15:32.233 回答
0

您的结构对我来说确实不错,这是大多数项目的典型结构-我会给出的一个建议是对您的依赖项进行版本控制,例如,让您的 webproject.war 依赖于 webmodule1-1.3 说,这样可能会有所不同项目可能有不同版本的依赖 jar。

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

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

于 2012-04-19T12:53:03.703 回答
-2

在处理了一点 OSGi 并得到了一些痛苦之后,我们为 Spring 开发了 osgi-less 模块化https://github.com/griddynamics/banshun你好!

于 2013-08-30T21:33:56.260 回答