Skip to content

Работа с модулями maven

wizardjedi edited this page Dec 18, 2012 · 7 revisions

Общие вопросы структуризации на модули

Модули в 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.

Clone this wiki locally