【发布时间】:2014-03-08 13:15:04
【问题描述】:
这是我在过去几周构建我的 maven 多模块项目以来的一次有趣经历。
当我决定使用 maven 进行构建生命周期管理时,我有几个原因希望选择 maven。
一个。大多数开发团队是分开的,以便每个团队可以在项目中的单独模块上工作,例如团队-A 负责用户管理系统,团队-B 负责授权系统,团队-C 负责文档管理系统......和很快。每个团队都有 Java 开发人员、测试人员、UI 专家等。
因此,maven 项目结构应该使得每个团队都可以独立地处理各自的模块。他们必须能够编码、编译、构建、测试、部署他们的模块,而无需编译、测试属于其他团队的模块。
因此我得出结论,maven 多模块项目的每个开发模块都必须代表一个功能模块
在论坛上进行了一些讨论后,我发现有人建议我遵循分层方法,子模块必须是控制器层、服务层、dao 层等层。我没有注意这个建议,因为这不能解决我的问题团队在单个模块上工作的目的。这样,对于大型项目,每个团队在开发过程中的构建和部署时间都会增加,这确实会影响项目时间线。如果项目中有 10 到 11 个模块,有时构建和部署时间长达 30 分钟。
但我确实注意到了一个建议,即为每个模块保留 DAO 层并不是一个好主意,因为 DAO 是高度精细的并且可以被其他模块重用。所以一个模块对另一个模块的依赖会变得更大。
我通过创建一个公共模块并将 DAO 和 DOMAIN 移动到公共模块中找到了解决此问题的方法,该公共模块将作为每个模块的依赖项继承。这似乎是一个更可行的选择。现在项目结构如下所示。
现在,当我构建项目并在服务器上运行 webapp 时,它会抱怨 404,找不到资源。我发现这是因为缺少 WEB-INF/classes 文件夹,web-app 模块中缺少 src/main/java。我搜索并发现了几个链接,表明它是 Eclipse 中的部署程序集问题。所以我需要手动创建这些文件夹并添加到部署程序集中,因为 maven 不这样做。
但更大的问题是
- 我是否需要将 com.mycompany.usermgmtsys.controller.UserMgmtController 等控制器类移动到 src/main/java 或者 maven 应该从作为依赖项包含在 WEB-INF/lib 中的模块 jar 中找到控制器。
我不想这样做,即将 java 文件放入 web-app。我希望所有控制器都可以作为依赖项提供给 Web 应用程序,例如 WEB-INF/lib/usermgmtsystem.jar。但是Tomcat不会在类文件夹中寻找控制器。
我不知道该怎么办?任何建议将不胜感激。
【问题讨论】:
-
您希望您的控制器/服务依赖于您的网络应用程序?那是倒退。您的 Web 应用程序是您的客户端层,应该位于架构“堆栈”的顶部。它应该向下调用到服务层,然后将请求编排到其他服务和/或域层。
-
在我的问题的任何地方,我并不是要颠倒依赖顺序。我所期望的只是让 web-app 从它在战争中打包的依赖 jar 中识别它的控制器,这样就没有 404。如果你看一下结构,我仍然有正确的依赖顺序,即 Common(它包含 DAO 和 DOMAIN ) 作为对 UserManagement 的依赖项,它作为对 Web-app 的依赖项。问题是因为我在各自的子模块中包含了各自的控制器,所以在 WEB-INF/classes 文件夹中找不到它们,而是在 WEB-INF/lib 中作为 jar 找到它们。
-
因为是依赖jar,所以应该在WEB-INF/lib中。这是正确的行为。
标签: java eclipse spring maven tomcat