Java 在小型应用程序中使用Maven Multimodule有什么好处吗?

Java 在小型应用程序中使用Maven Multimodule有什么好处吗?,java,web-applications,maven,multi-module,Java,Web Applications,Maven,Multi Module,我们正在使用不同的体系结构层(如域、接口、基础设施和应用程序)构建一个小型应用程序。这遵循洋葱DDD模型。现在我想知道将应用程序拆分为多模块maven项目是否有任何好处。就我现在所见,这似乎使事情变得比需要的更困难。整个应用程序将作为单个WAR文件部署到Tomcat容器中。使用多个模块迫使您拥有一个依赖关系层次结构。您有一个独立的模块,不依赖于任何其他模块。你有另一个,这只取决于这个。它可能看起来比允许任何东西依赖于任何其他东西都要困难,但这种方法会导致混乱的依赖关系,以后很难修复 如果您试图遵

我们正在使用不同的体系结构层(如域、接口、基础设施和应用程序)构建一个小型应用程序。这遵循洋葱DDD模型。现在我想知道将应用程序拆分为多模块maven项目是否有任何好处。就我现在所见,这似乎使事情变得比需要的更困难。整个应用程序将作为单个WAR文件部署到Tomcat容器中。

使用多个模块迫使您拥有一个依赖关系层次结构。您有一个独立的模块,不依赖于任何其他模块。你有另一个,这只取决于这个。它可能看起来比允许任何东西依赖于任何其他东西都要困难,但这种方法会导致混乱的依赖关系,以后很难修复


如果您试图遵循分层模型,我建议您将每个层放在不同的模块中。这将确保您不会试图破坏模型。

如果您希望在另一个项目中重用类,或者如果您的项目以不同的配置部署,则将项目拆分为多个maven项目非常有用

也许可以考虑Web服务——如果您托管服务器,您可以为您的域类(模型)和端点接口构建一个项目,服务器和客户端都可以使用该项目。服务器将是另一个为WAR构建的项目

为了进一步开发客户,也可以使用第一个项目


使用父项目对常见项目(如日志记录)以及不同的配置文件和生成配置进行依赖关系管理。

拆分应用程序有助于实现以下目标:

  • 当项目的某个部分需要有新的功能或bug修复时,您只需关注该模块并为其运行测试即可。编译所有代码的一小部分并只运行相关的测试可以加快您的工作

  • 您可以跨不同的项目重用模块中的代码。让我们假设您的项目包含一些编写良好的通用代码,足以用于邮件发送。如果您以后有另一个项目需要邮件发送功能,您可以简单地重用现有模块或在其上构建(在另一个模块中,通过将其作为依赖项添加)

  • 从长远来看,更容易维护。也许现在它看起来像一个小项目。几个月后,事情可能会有所不同,然后需要进行更多的重构,将事情拆分为逻辑单元(模块)

  • 概念清晰(由Adriaan Koster补充)

关于WAR:您可以拥有一个组装模块,它将所有相关模块组合在一起并生成最终的WAR文件


起初,这似乎需要更多的工作,但从长远来看,模块化项目更易于使用和维护。大多数理智的开发人员都喜欢这种方法。

据我所知,Maven对WAR依赖性几乎没有帮助。当你们谈论单一战争时,这永远不会是一个问题

您可以将java类分为几个“jar”子模块,但是如果您将WAR项目分为几个较小的WAR,使用某种“重叠”的打包方式,事情就会变得复杂

只是信息,我们的一个项目,它包含太多的网页,所以我们决定将其拆分为几个WAR子模块,但是,会话不会在部署的不同WAR之间共享,我们也不会使用Kerberos之类的东西。最后,我们修改了Glassfish、Jetty、MyFaces等的许多源代码,使它们能够解析jar中的web.xml内容。并将整个项目转换为Facelets 2.0(以避免JDK tools.jar和自定义资源处理程序的依赖),唯一的原因是将WAR子模块更改为jar子模块,并将所有webapp/页面移动到类资源中。因此,结论是,Maven在JAR依赖性方面做得很好,但没有战争或单一战争


编辑您可以将
applicationContext.xml
放在一个基本子模块中,并通过
classpath:com/example/applicationContext.xml
导入它。另外,Spring 3.0也支持注释,您可以让Spring自动扫描它们,而不是在xml中声明它们。

简短回答:今天它很小,明天它会更大,维护、重用、扩展和维护会更复杂,与其他系统集成等等

到底有什么比拥有单个模块更困难?在所有模块中使用Composite Spring applicationContext.xml的困难。我想我需要创建一个applicationContext.xml,以便在Spring中为所有单独的模块使用,或者我遗漏了什么?您不应该需要多个应用程序上下文。您可以有几个独立的模块,并且只有一个applicationContext.xml来连接这些模块的依赖关系。另一个好处是:它加强了体系结构概念的清晰性。