Maven 多模块项目结构问题

2024-05-10

自从过去几周构建我的 Maven 多模块项目以来,这是我的一次有趣的经历。

当我决定使用 Maven 进行构建生命周期管理时,我有几个原因希望选择 Maven。

A。大多数开发团队都是分开的,这样每个团队都可以在项目中的单独模块上工作,例如团队 A 负责用户管理系统,团队 B 负责授权系统,团队 C 负责文档管理系统......很快。每个团队都有java开发人员、测试人员、UI专家等。

所以maven项目结构应该是这样的,每个团队都可以独立地工作在各自的模块上。他们必须能够编码、编译、构建、测试、部署他们的模块,而不必编译、测试属于其他团队的模块。

因此我得出结论,maven多模块项目的每个开发模块都必须代表一个功能模块

经过论坛上的一些讨论后,我发现人们建议我遵循分层方法,子模块必须是控制器层、服务层、dao 层等层。我没有注意到这个建议,因为这不能解决我的团队目的在单独的模块上工作。这样,对于大型项目,每个团队在开发过程中的构建和部署时间都会增加,这确实会影响项目时间线。有时,如果项目中有 10 到 11 个模块,则构建和部署时间长达 30 分钟。

但我确实注意到了一个建议,即为每个模块保留 DAO 层并不是一个好主意,因为 DAO 是高度粒度的并且可以被其他模块重用。因此,一个模块对另一个模块的依赖性无论如何都会变得更大。

我找到了解决这个问题的方法,方法是创建一个公共模块并将 DAO 和 DOMAIN 移动到公共模块,该模块将作为每个模块的依赖项继承。这似乎是一个更可行的选择。现在项目结构如下所示。

现在,当我构建项目并在服务器上运行 web 应用程序时,它抱怨 404,找不到资源。我发现这是因为 WEB-INF/classes 文件夹丢失,web-app 模块中缺少 src/main/java 。我搜索并发现了几个链接,表明这是 Eclipse 中的部署程序集问题。所以我需要手动创建这些文件夹并添加到部署程序集中,因为 Maven 不这样做。

但更大的问题是

  1. 我是否需要将 com.mycompany.usermgmtsys.controller.UserMgmtController 等控制器类移动到 src/main/java 或者 maven 应该从作为依赖项包含在 WEB-INF/lib 中的模块 jar 中找到控制器。

我不想这样做,即将 java 文件放入网络应用程序中。我希望所有控制器都应作为依赖项可供 Web 应用程序使用,例如 WEB-INF/lib/usermgmtsystem.jar。但是 Tomcat 不会在类文件夹中寻找控制器吗?

我不知道我该怎么办?任何建议,将不胜感激。


这是 Eclipse 渲染基于 Maven 的项目的方式。它通常创建两个结构。一种基于 master pom(父项目),另一种基于单个模块 pom。然而,对任何结构进行更改都会反映在另一个结构中。作为一种实践,我对各个模块文件夹结构进行了更改,并且也更易于阅读。

就我个人而言,我会尽量避免多模块项目,因为如果您使用 Maven 发布插件,那么您将被迫一起发布所有模块。

虽然这听起来很方便,但当您需要对其中一个模块进行错误修复发布时,问题就会出现 - 您最终会释放所有模块,而不仅仅是修复了错误的模块,从而增加其版本,即使它们没有改变了。

如果您使用多模块项目运行 CI,您也会受到影响 - 您的构建通常会从根 pom 运行所有模块,但如果您在特定模块中工作,您最终会受到构建这些模块的影响这并没有改变,实际上失去了模块化本应提供的一些好处。

因此,使用独立的模块,但是,这是重要的一点,创建每个模块使用的公共“依赖项”pom。

“依赖项”pom 是一个标准化项目中所有依赖项的 pom,其不同之处在于这些依赖项是在 dependencyManagement 部分而不是依赖项部分中指定的(它还设置标准插件配置等)。这允许您的项目 pom 指定依赖项 pom 作为其父级,然后声明它们所需的依赖项减去版本,这些版本是从“依赖项”pom 中获取的,从而在您的项目中进行标准化。

如果您仍然担心能否构建所有内容,可以通过一个简单的批处理文件来实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Maven 多模块项目结构问题 的相关文章

随机推荐