有一个maven项目构建自己的依赖项?
有了maven,有可能有一个顶级项目的包装类型是“war”,它将构建自己及其所有依赖模块(打包为jar)并让build生成一个project.war文件?
我见过的大部分文档示例和其他示例经常使用包装类型为“pom”的顶级项目,该项目仅用于将模块绑定在一起。 我可以避免这个吗?
所以基本上我需要一些有效的方法,就像声明一个my-module
来构建maven,并在同一个POM中,声明一个...my-module's artifact...
在需要构建的同一模块上。 也许有人建议的插件?
更新 :换句话说(为了简化问题):如果我有project A
和project B
, project A
依赖于project B
– 有没有办法让我在project A
上执行构建并让它自动构建project B
(并将project B
包含为其依赖项 – 创建包含projectB.jar的projectA.war)?
这不是一个顶级项目的真正含义。 您的WAR项目具有依赖项,这些依赖项是运行“mvn package”时将包含在WAR(在WEB-INF / lib中)中的工件(例如jar)。 您的WAR项目pom可以将顶级项目作为其父项,但它不应该是其依赖项的父项。 您可能希望将该顶级项目作为WAR项目和WAR中依赖项的JAR项目的父项。
super_aardvark建议正确的方法,但是,
对于要求我建议以下结构它也是合适的和良好的结构:
将ProjectA
视为project-webapp
,将ProjectB
视为project-core
您可以拥有以下结构:
你的大项目:
4.0.0 com.mycompany.project project 2.0-SNAPSHOT pom Project Repository System Project Repository System R2 project-core project-webapp
您的WebApp项目:
com.mycompany.project project 2.0-SNAPSHOT 4.0.0 project-webapp 2.0-SNAPSHOT war Project Web Application Project Repository com.mycompany.project project-core 2.0-SNAPSHOT
您的核心项目:
com.mycompany.project project 2.0-SNAPSHOT 4.0.0 project-core 2.0-SNAPSHOT jar Project Core ProjectCore
您的目录结构应如下所示:
-------Grand Parent.pom | |--------project-webapp | | | project-webapp.pom | | -------project-core.pom | project-core.pom
从父pom执行mvn clean install
,它将构建web-app和核心项目
这在Maven 1,2或3中是不可能的。
我建议放弃这个想法,因为Maven的全部目的是强制执行标准化的开发过程 。 不要对抗结构,只需创建父POM模块并在其下创建WAR模块和其他依赖项。
如果您有一个多模块项目,并且您同时在多个模块中工作,则可能会很繁琐且容易出错,以确保更新所有必需的依赖项。
在我的情况下,我希望我的构建系统检测更改,并只构建必要的模块。 使用maven可能的一种方法是让某人编写一个自定义插件来执行此操作,这看起来并不是不可克服的,因为已经有很复杂的插件可用,比如maven发布插件。
其他人已经提到了聚合pom概念,它是可重复的并且确实产生了必要的伪像。 但有时你最终会建造超出你真正需要的东西。
Maven的个人资料可以提供帮助,这是一篇很好的文章:
使用Aggregate和Parent POM
在文章中还要注意批量pom的概念,我以前没有意识到这一点。
请记住,mvn clean install会将您的工件推送到您的本地仓库。 因此,如果模块A依赖于模块B,只要您的本地存储库具有模块B的最新版本,那么您应该全部设置。 因此,如果有一个外部工具正在监视模块B的更改并在有并将这些更改推送到本地存储库时自动构建它,那么当重建模块A时,它将获取这些更改。 有像Jenkins这样的持续集成(CI)工具可以做到这一点。 但是您需要本地安装才能直接使用本地存储库进行此操作。 不过,这仍然是一个选择。
另一个选择是CI环境将您的构建推送到外部maven仓库(甚至是您在本地使用Nexus之类的东西设置)。 然后,您也可以设置CI构建以从该位置拉出。
因此,有些解决方案依赖于其他工具或潜在的插件来做你想做的事情 – 只需要花多少时间和精力来投入所有设置。 但是,一旦你克服了这个障碍,你将拥有一个可以用于所有项目的系统(以及知识和经验),更不用说你将熟悉有多少开发商店/团队工作。
我建议研究持续集成和持续交付以获取更多信息和想法。
在父pom中,您必须定义要编译的模块的顺序。 您可以将war包装模块添加到该列表中的最后一个。 它只是将所有以前编译的代码聚合在一起。
不是真的 – (好吧,我可以想到几种方法,但我不会使用它们,因为它们令人费解并违背了Maven的基本精神/做法)。
不要忘记顶级pom的另一个目的是提供单点来设置常见细节,例如项目模块中使用的依赖项的特定版本。
NetBeans有一个选项,允许您使用Maven项目完成此操作,但我不知道任何纯Maven解决方案。 我认为该任务更适合IDE,因为它知道您拥有代码的项目(根据您在工作区中打开的项目)。 Maven如何区分您要构建的依赖项和需要从存储库中获取的依赖项。 对于那些需要构建的人来说,它应该在哪里寻找源代码?
无论如何,我成功使用了几次问题的另一个解决方案是创建一个简单的shell脚本,导航到你的项目文件夹并启动构建然后它等待它完成然后继续下一个项目,依此类推。