Типичная структура проекта с несколькими модулями maven включает в себя 3 модулей: агрегирующий родительский модуль (позволяющий запустить многомодульную сборку на всех модулях), модуль модели и веб-модуль. Как то так:
.
├── mymodule
│ ├── pom.xml
│ └── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ └── test
│ ├── java
│ └── resources
├── mywebapp
│ ├── pom.xml
│ └── src
│ └── main
│ ├── resources
│ └── webapp
│ ├── index.jsp
│ └── WEB-INF
│ └── web.xml
└── pom.xml
Где родитель pom.xml
(в корне) будет выглядеть так:
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stackoverflow</groupId>
<artifactId>Q4176120</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Q4176120 - Parent POM</name>
<url>http://maven.apache.org</url>
<dependencies>
...
</dependencies>
<modules>
<module>mywebapp</module>
<module>mymodule</module>
</modules>
</project>
mymodule/pom.xml
будет обычным POM:
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>Q4176120</artifactId>
<groupId>com.stackoverflow</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<!--groupId>com.stackoverflow</groupId--> <!-- inherited -->
<artifactId>mymodule</artifactId>
<packaging>jar</packaging>
<name>Q4176120 - Module</name>
<dependencies>
...
</dependencies>
</project>
И mywebapp/pom.xml
объявит зависимость от артефакта mymodule:
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>Q4176120</artifactId>
<groupId>com.stackoverflow</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<!--groupId>com.stackoverflow</groupId--> <!-- inherited -->
<artifactId>mywebapp</artifactId>
<packaging>war</packaging>
<name>Q4176120 - Maven Webapp</name>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mymodule</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<finalName>Q4176120</finalName>
</build>
</project>
С этой структурой вы можете запустить сборку из нескольких модулей из родительского каталога, то есть запустить цель для всех модулей (и maven рассчитает правильный порядок сборки):
$ mvn install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] Q4176120 Parent POM
[INFO] Q4176120 Module
[INFO] Q4176120 Maven Webapp
[INFO]
...
Обратите внимание, что я также использовал наследование в приведенных выше примерах (mymodule
и mywebapp
наследуют от родителя, объявленного в элементе <parent>
), так что я может группировать общие части в родительском POM и избегать повторения. Это не обязательно, вы можете использовать агрегацию без наследования, но это очень удобно, и на практике агрегация и наследование часто сочетаются.
Ресурсы
- Maven Документация
- Maven Book