Привет хабр, много было уже на писано на тему liquibase и Maven, но я не смог найти ничего про liquibase-maven-plugin и его настройку, а ведь это очень удобный плагин. Вот я и решил написать о том, как его настроить.
Плагин liquibase-maven-plugin предназначен для управления liquibase из Maven. Вот пример команды mvn liquibase:update, для обновления базы данных.
Для начала предлагаю разобраться с тем, что такое Maven и liquibase.
Мавен — это инструмент для сборки Java проекта: компиляции, создания jar, создания дистрибутива программы, генерации документации. Более подробно о самом Maven можно прочитать в статье Apache Maven — основы
Liquibase — это система управления миграциями базы данных. Для ознакомления с liquiabase так же можно прочитать в статье Управление миграциями БД с Liquibase
После того, как мы разобрались с Maven и liquibase, можно перейти к созданию maven проекта и настройке liquibase плагина.
Для начала создадим новый Maven проект, его структура будет выглядеть следующим образом:
Соответственно, pom файл, данного проекта, будет выглядеть:
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>liquibaseTest</groupId>
<artifactId>ru.test.liquibase</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
Далее в папке «src/main/resources» создадим папку «liquibase» в которой у нас будут храниться changelog файлы.
В папке liquibase создадим 2 файла:
- db.changelog-master.xml — основной файл миграции, в него с помощью тега
<include>
включаются файлы ченджлогов каждой версии - db.changelog-0.1.0.xml — ченджлог файл, содержащий ченджсеты. Каждый ченджсет это одна транзакция
Рассмотрим данные файлы более подробно:
db.changelog-master.xml
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd">
<include file="src/main/resources/liquibase/db.changelog-0.1.0.xml"/>
</databaseChangeLog>
В строке <include file="src/main/resources/liquibase/db.changelog-0.1.0.xml"/>
мы подключаем db.changelog-0.1.0.xml файл с ченджсетами, в которых мы выполняем действия с базой данных.
db.changelog-0.1.0.xml
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd">
<changeSet id="19082014-1" author="autor">
<comment>
Создание таблицы изображений
</comment>
<sql>
CREATE TABLE images
(
id bigint NOT NULL,
alt character varying(255),
url_big character varying(255),
url_small character varying(255),
CONSTRAINT images_pkey PRIMARY KEY (id)
)
</sql>
</changeSet>
</databaseChangeLog>
Теперь нам необходимо настроить liquibase plugin для Maven. Для этого открываем наш pom файл и добавляем туда:
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.0.7</version>
<configuration>
<changeLogFile>src/main/resources/liquibase/db.changelog-master.xml</changeLogFile>
<driver>org.postgresql.Driver</driver>
<url>jdbc:postgresql://localhost:5432/test</url>
<username>postgres</username>
<password>postgres</password>
</configuration>
<executions>
<execution>
<phase>process-resources</phase>
<goals>
<goal>update</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
В данной конфигурации мы подключаем liquibase-maven-plugin и для него определяем:
- changeLogFile — путь до основного файла миграции
- driver — драйвер для подключения к бд
- url — url для подключения к бд
- username — для подключения к бд
- password — для подключения к бд
Внутри тега <goal>update</goal>
мы определяем, что будем обновлять базу данных при сборке проекта, так же возможны и другие варианты.
Вот в принципе и все, ничего сложного нет. Теперь мы можем обновить нашу базу данных одной командой mvn liquibase:update, находясь в папке с проектом, или при сборке основного проекта. В данном случае будет использоваться <goal>update</goal>
.
Более подробно о плагине можно прочитать на его официальном сайте.
Ниже приведу пример полностью сконфигурированного pom.xml
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>liquibaseTest</groupId>
<artifactId>ru.test.liquibase</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.0.7</version>
<configuration>
<changeLogFile>src/main/resources/liquibase/db.changelog-master.xml</changeLogFile>
<driver>org.postgresql.Driver</driver>
<url>${server.db.host}</url>
<username>${server.db.user}</username>
<password>${server.db.pass}</password>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
</configuration>
<executions>
<execution>
<phase>process-resources</phase>
<goals>
<goal>update</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<finalName>liquibaseTest</finalName>
</build>
</project>
Автор: PACCBET64