-
Notifications
You must be signed in to change notification settings - Fork 56
Работа с модулями maven
Модули в maven позволяют структурировать проекты. С помощью модулей возможно создавать корневой модуль maven, в который вложены другие модули.
Кроме структуризации, разделение на модули позволяет упорядочить процесс сборки - собираем основной модуль и автоматически собираются все подмодули.
Зависимости между модулями (связ типа модуль - подмодуль) описываются в разделах <modules />
для корневого модуля и <parent />
- для подмодуля.
Использование модулей позволяет описывать межпроектные(точнее межкомпонентные) зависимости, не создавая собственный репозиторий maven.
Например, у нас есть серверные и клиентские логики и клиентские логики зависят от некоторых классов из серверных. В таком случае возможно разделить проект на server и client, и клиентский модуль будет зависеть от модуля server. С другой стороны производится будет сборка корневого модуле и, соответственно, всех подмодулей.
Для начала создадим общий модуль module_project/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>a1s</groupId>
<artifactId>module_project</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<name>module_project</name>
<modules>
<module>server</module>
<module>client</module>
</modules>
</project>
Важным моментом является тип упаковки <packaging>pom</packaging>
(у подмодулей тип упаковки будет jar).
В данном модуле объявлены 2 подмодуля (в разделе <modules />
):
- server (
<module>server</module>
) - client (
<module>client</module>
)
Создадим 2 проекта по адресам:
module_project/server
module_project/client
pom.xml для сервера
module_project/server/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>a1s</groupId>
<artifactId>server</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>server</name>
<parent>
<groupId>a1s</groupId>
<artifactId>module_project</artifactId>
<version>1.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
</project>
Важным является раздел ссылки на корневой модуль.
<parent>
<groupId>a1s</groupId>
<artifactId>module_project</artifactId>
<version>1.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
pom.xml для клиента
module_project/client/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>a1s</groupId>
<artifactId>client</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>client</name>
<parent>
<groupId>a1s</groupId>
<artifactId>module_project</artifactId>
<version>1.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>a1s</groupId>
<artifactId>server</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
<compress>true</compress>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>libs/</classpathPrefix>
<mainClass>a1s.client.App</mainClass>
</manifest>
</archive>
</configuration>
<version>2.4</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
</configuration>
</execution>
</executions>
<version>2.5.1</version>
</plugin>
</plugins>
</build>
</project>
так же указана ссылка на корневой модуль и добавлены плагины для упаковки и сборки с зависимостями.
Теперь реализуем классы для сервера и клиента:
package a1s.server;
public class Server {
public int add(int a,int b){
return a+b;
}
public int mul(int a,int b){
return a*b;
}
}
package a1s.client;
import a1s.server.Server;
public class App {
public static void main(String[] argv)
{
Server s = new Server();
System.out.println("Summ is " + s.mul(2,7));
}
}
теперь перейдём в директорию module_project
и выполним кломанду сборки
$ mvn clean install
Теперь можем перейти в директорию module_project/client/target/
и выполнить команду на запуск
$ java -jar client-1.0.jar
Summ is 14
Все настройки, сделанные в корневом модуле(зависимости, свойства и т.д.) также будут перенесены в дочерние модули.
Например, добавим в зависимости spring-core
.
module_project/pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.1.3.RELEASE</version>
</dependency>
</dependencies>
теперь если собрать проект, то в директории client/target/libs
можно увидеть все зависимости для клиента
$ mvn clean install
$ cd client/target
$ ls
classes client-1.0.jar libs surefire
$ ls libs/
commons-logging-1.1.1.jar server-1.0.jar spring-asm-3.1.3.RELEASE.jar spring-core-3.1.3.RELEASE.jar
Наши зависимости от spring-core
и server-1.0
в директории libs
.