Skip to content

Пример gradle мультипроекта

Синопсис


Проект можно взять с гитхаба: https://github.com/dev-blogs/multiple-gradle-project

Структура проекта

Проект будет мультимодульный, то есть будет несколько подпроектов project1, project2 и project3 в проекте враппере gradle-project:

gradle-project
    ├──project1
    │   ├─src
    │   │   ├─main
    │   │   │   └─java
    │   │   │       └─com             ┌──────────────────────┐
    │   │   │           └─devblogs    ↓                      │
    │   │   │                 └───Service.java<───────┐      │
    │   │   └─test                                    │      │
    │   │       └─java                                │      │ calls for testing
    │   │           └─com                             │      │
    │   │               └─devblogs                    │      │
    │   │                    └────TestService.java────┼──────┘
    │   └─build.gradle                                │
    ├──project2                                       │
    │   ├─src                                         │ calls
    │   │   ├─main                                    │
    │   │   │   └─java                                │
    │   │   │       └─com             ┌───────────────┼──────┐
    │   │   │           └─devblobs    ↓               │      │
    │   │   │                   └─Project2.java───────┘      │
    │   │   └─test                    ↑                      │
    │   │       └─java                └───────────────┐      │ calls for testing
    │   │           └─com                             │      │
    │   │               └─dev                         │      │
    │   │                   └─blogs                   │      │
    │   │                       └─TestProject2.java───┼──────┘
    │   └─build.gradle                                │
    ├──project3                                       │
    │   ├─src                                         │ calls
    │   │   ├─main                                    │
    │   │   │   └─java                                │
    │   │   │       └─com             ┌───────────────┼──────┐
    │   │   │           └─devblogs    ↓               │      │
    │   │   │                   └─Project3.java───────┘      │
    │   │   └─test                                           │
    │   │       └─java                                       │ calls for testing               
    │   │           └─com                                    │
    │   │               └─dev                                │
    │   │                   └─blogs                          │
    │   │                       └─TestProject3.java──────────┘
    │   └─build.gradle
    ├──build.gradle
    └──settings.gradle

На схеме выше стрелками с маркером calls показано как подпроекты между собой зависят. Project3 зависит от Project2 который зависит от Project1. Так же внутри каждого подпроекта тестирующий класс вызывает тестируемый класс, это показано стрелками с маркером calls for testing.

Добавляем код

Теперь добавим код для каждого класса и градловского скрипта сборки. Кода будет не много, потому что это демонстрация того как с помощью градла связать несколько подпроектов.
=================ROOT====================
Начнем с корневого градловского скрипта. В нем описано, что для каждого продпроекта объявляется java плагин, какие подтягивать зависимости и с какого репозитория:

build.gradle

subprojects {
	apply plugin: 'java'
	
	repositories {
		mavenCentral()
	}
	
	dependencies {
		testCompile 'junit:junit:4.11'
	}
}

Градл сам по себе не сканирует проект на поиск подпроектов, поэтому о всех имеющихся подпроектах ему надо явно указать в файле settings.gradle:

settings.gradle

include 'project1'
include 'project2'
include 'project3'

===============PROJECT1====================
Теперь добавим класс Service который будет просто возвращать сообщение.

project1/Service.java

package com.devblogs;

public class Service {
	public String getMessage() {
		return "service project1";
	}
}

В тестирующем классе TestService будем тестировать класс Service на соответствие строки service project1:

project1/TestService.java

package com.devblogs;

import org.junit.*;

public class TestService {
	@Test
	public void testMessage() {
		Service service = new Service();
		Assert.assertEquals(service.getMessage(), "service project1");
	}
}

Градловский скрипт для project1 оставляем пустым, так как все необходимые инструкции придут сверху то есть от проекта враппера:

project1/build.gradle

//empty

===============PROJECT2====================
Класс Project2 будет юзать сервис Service из подпроекта Project1. В данном случае это означает, что класс Project2 будет запрашивать с класса Service сообщение:

project2/Project2.java

package com.devblogs;

public class Project2 {
	public String getMessage() {
		Service service = new Service();
		return service.getMessage();
	}
}

В тестирующем классе TestProject2 будет делаться все тоже самое, что делалось в тестируемом классе TestService. Так как класс Project2 запрашивает сообщение из класса Service подпроекта Project1, то тестирующий класс TestProject2 будет проверять на соответствие той же строке service project1:

project2/TestProject2.java

package com.devblogs;

import org.junit.*;

public class TestProject2 {
	@Test
	public void testProject2GetMessage() {
		Project2 project2 = new Project2();
		Assert.assertEquals(project2.getMessage(), "service project1");
	}
}

Так как подпроект project2 должен видеть класс Service из подпроекта project1 то добавим в градл билд скрипт подпроекта project2 соответствующую зависимость:

project2/build.gradle

project.dependencies{
    compile(project(':project1'))
}

===============PROJECT3====================
Класс Project3 будет обращаться к классу Project2 из подпроекта project2, запрашивая у него строку:

project3/Project3.java

package com.devblogs;

public class Project3 {
	public String getMessage() {
		Project2 project2 = new Project2();
		return project2.getMessage();
	}
}

Тестирующий класс TestProject2 будет тестировать класс Project3 на соответствие строке service project1 возвращенной из класс Project2 из подпроекта project2:

project3/TestProject3.java

package com.devblogs;

import org.junit.*;

public class TestProject3 {
	@Test
	public void testProject3GetMessage() {
		Project3 project3 = new Project3();
		Assert.assertEquals(project3.getMessage(), "service project1");
	}
}

Класс Project3 подпроекта project3 обращается к классу Project2 из подпроекта project2, поэтому класс Project3 должен видеть класс Project2. Для этого так же как в билд скрипте подпроекта project2 нужно добавить соответствующую зависимость:

project3/build.gradle

project.dependencies{
    compile(project(':project2'))
}

Сборка

После того как код добавлен попробуем собрать проект. Для этого в корне проекта введите градловскую команду:

gradle clean build

Если все сделано правильно, то в выводе будут лайфсайклы для каждого подпроекта:

:project1:clean
:project2:clean
:project3:clean
:project1:compileJava
:project1:processResources UP-TO-DATE
:project1:classes
:project1:jar
:project1:assemble
:project1:compileTestJava
:project1:processTestResources UP-TO-DATE
:project1:testClasses
:project1:test
:project1:check
:project1:build
:project2:compileJava
:project2:processResources UP-TO-DATE
:project2:classes
:project2:jar
:project2:assemble
:project2:compileTestJava
:project2:processTestResources UP-TO-DATE
:project2:testClasses
:project2:test
:project2:check
:project2:build
:project3:compileJava
:project3:processResources UP-TO-DATE
:project3:classes
:project3:jar
:project3:assemble
:project3:compileTestJava
:project3:processTestResources UP-TO-DATE
:project3:testClasses
:project3:test
:project3:check
:project3:build

BUILD SUCCESSFUL

Total time: 14.341 secs

Линки

http://habrahabr.ru/post/192268/

Поделиться в социальных сетях

Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *