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 多模块项目结构问题 的相关文章

  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 使用Spring将war文件WEB-INF目录下的资源导入到applicationContext文件中

    我在我的项目中使用 Spring 框架 我想导入下面的所有 xml 资源 文件 WEB INF CustomerService spring integration Jobs applicationContext配置文件中war文件的目录
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Maven中archetype.xml和archetype-metadata.xml有什么区别

    我正在尝试向我的原型添加额外的变量 具体来说 我的原型包含一个 logback xml 文件 我想用我从原型生成的项目的名称填充日志文件名 我正在执行此处答案中的说明将额外的属性传递给 Maven archetype generate ht
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐