草庐IT

java - Maven 多模块项目结构化问题

coder 2024-03-04 原文

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

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

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

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

由此得出结论,maven多模块项目的每个开发模块都必须代表一个Functional Module

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

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

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

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

但更大的问题是

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

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

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

最佳答案

这是 eclipse 渲染基于 maven 的项目的方式。它通常创建两个结构。一个基于主 pom(父项目),其他基于单个模块 pom。但是,对任何结构进行更改都会反射(reflect)在另一个结构中。作为一种实践,我对各个模块文件夹结构进行了更改,这样也更易于阅读。

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

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

如果你在多模块项目中运行 CI,你也会受到打击——你构建的通常是从根 pom 运行所有模块,但如果你在一个特定的模块中工作,你最终会受到打击构建那些没有改变的东西,实际上失去了模块化本应提供的一些好处。

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

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

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

关于java - Maven 多模块项目结构化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21690215/

有关java - Maven 多模块项目结构化问题的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  4. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  5. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  6. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  7. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  8. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  9. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  10. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

随机推荐