Как настроить плагин Maven Liquibase в Spring Boot? - PullRequest
1 голос
/ 09 апреля 2019

Я изучаю Liquibase и Spring Boot, поэтому я создал простой проект с Spring Initializr .

В добавленном мной файле POM.xml:

    <plugin>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-maven-plugin</artifactId>
        <version>3.4.1</version>
        <configuration>
            <propertyFile>src/main/resources/application.properties</propertyFile>
        </configuration>
    </plugin>

Я указал в качестве файла свойств application.properties, поэтому вся конфигурация моего приложения может быть в одном файле.

Когда я запускаю любую задачу liquibase-maven-plugin из IntelliJ, я получаю разные ошибки, вот пример запуска задачи changeLogSync:

[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:3.4.1:changelogSync (default-cli) on project simpleTest: The changeLogFile must be specified

Если я добавлю нужные ключи в приложение. Свойства, я смогу заставить его работать.

Например, я обнаружил, что liquibase-maven-plugin не будет читать свойство spring.datasource.url , а будет читать только свойство url .

По этой причине мои application.properties должны быть похожими:

environment                         = JUnit
spring.datasource.url               = jdbc:h2:file:./target/test
spring.datasource.driver-class-name = org.h2.Driver
spring.datasource.username          = sa
spring.datasource.password          = sa
spring.liquibase.change-log         = classpath:/db/changelog/db.changelog-master.yaml
spring.h2.console.enabled           = true
spring.h2.console.path              = /h2-console


# Keys needed for liquibase maven plugin
url                                 = jdbc:h2:file:./target/test
username                            = sa
password                            = sa

Если я буду следовать этому шаблону, у меня получится несколько ключей с немного разными именами, но с одинаковыми значениями в моем application.properties, и это решение явно очень уродливо и неэффективно.

Какой эффективный и поддерживаемый способ настройки и использования Liquibase Maven Plugin в Spring Boot?

Редактировать после ответа, полученного от Амит Кумар:

environment=JUnit
spring.datasource.url=jdbc:h2:file:./target/glossary-test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=sa
spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.yaml
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
url=${spring.datasource.url}
changeLogFile=${spring.liquibase.change-log}
username=${spring.datasource.username}
password=${spring.datasource.password}

Ошибка после редактирования:

[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:3.4.1:dropAll (default-cli) on project test: Error setting up or running Liquibase: liquibase.exception.DatabaseException: java.lang.RuntimeException: Cannot find database driver: Driver class was not specified and could not be determined from the url (${spring.datasource.url}) -> [Help 1]

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

application.properties настройки очень быстрые, чтобы иметь работающее приложение, но не лучшее решение с точки зрения гибкости

Мой совет - настроить источник данных, используя @Configuration, пример здесь

И затем сконфигурируйте источник данных прохождения жидкости в базе данных, определенный выше, следующим образом:

@Configuration
public class LiquibaseConfigurer {

    @Autowired
    @Qualifier("primaryDataSource")
    private DataSource oltpDataSource;

    @Bean
    @DependsOn
    public SpringLiquibase liquibase() {
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setChangeLog("classpath:liquibase/liquibase-changelog.xml");
        liquibase.setDataSource(oltpDataSource);
        return liquibase;
    }
}

В этом случае вам просто нужна liquibase-core зависимость следующим образом

    <dependency>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-core</artifactId>
    </dependency>

Более простой альтернативой является настройка liquibase вне приложения без подключаемого модуля maven.

Загрузите библиотеку или установите ее с помощью какого-либо менеджера пакетов и запустите командную строку со всеми настройками

liquibase --driver=org.h2.Driver \
     --classpath=/path/to/h2/driver.jar \
     --changeLogFile=/db/changelog/db.changelog-master.yaml \
     --url="jdbc:h2:file:./target/glossary-test" \
     --username=sa \
     --password=sa \
     --logLevel=debug \
     migrate

В любом случае, проблема у вас сейчас в том, что вы написали это:

url=${spring.datasource.url}

Я не знаю, где вы нашли этот синтаксис, но попробуйте скопировать URL-адрес подключений и заменить на следующий

url=jdbc:h2:file:./target/test

сделать то же самое для других настроек

1 голос
/ 09 апреля 2019

Это очень распространенное явление во многих проектах.

Когда вы используете несколько плагинов / библиотек, каждый ожидает определенные свойства из конфигурации среды, где имена ключей определены в их собственной номенклатуре.

Нет стандартизации для этой проблемы.

Чтобы не указывать одинаковые значения для нескольких свойств, что может привести к ошибкам, рекомендуется использовать ссылки.

# Keys needed for liquibase maven plugin
url=${spring.datasource.url}

UPDATE

Я заметил, что вы столкнулись с исключением при запуске плагина liquibase maven, который, конечно, работает вне контекста весны. Решение, которое я предоставил ранее, работает в контексте Spring, то есть, когда у вас запущено приложение.

Для данного сценария используйте maven фильтр файлов ресурсов . Таким образом, ваша команда изменится на

mvn liquibase: generateChangeLog ресурсы: ресурсы

И ваша установка будет выглядеть так:

SRC / главная / фильтры / filter.properties

db.url=jdbc:h2:file:./target/glossary-test
db.username=sa
db.password=sa
db.driver=org.h2.Driver
db.lb.changeLogFile=classpath:/db/changelog/db.changelog-master.yaml

application.properties

spring.datasource.url=@db.url@
spring.datasource.username=@db.username@
spring.datasource.password=@db.password@
spring.datasource.driver-class-name=@db.driver@
url=@db.url@
username=@db.username@
password=@db.password@
driver=@db.driver@
changeLogFile=@db.lb.changeLogFile@

pom.xml

<build>
......
    <plugins
        ......
        <plugin>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-maven-plugin</artifactId>
            <version>3.6.3</version>
            <configuration>
                <propertyFile>target/classes/application.properties</propertyFile>
            </configuration>
        </plugin>

    </plugins>

    <filters>
        <filter>src/main/filters/filter.properties</filter>
    </filters>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

Пожалуйста, обратитесь к моему github проект для полного рабочего решения. Посмотрите на файл filter.properties, в котором определены общие свойства, а затем он указан в файле application.properties.

ПРИМЕЧАНИЕ: Поскольку это весенний проект, вы не можете использовать ${propertyName} для файла фильтра maven в качестве синтаксиса зарезервированного заполнителя свойства для пружины, но затем используйте @propertyName@. Для не весеннего проекта ${propertyName} будет работать из коробки.

...