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