Используя пути файла Liquibase через оба maven и spring
Я обновляю схему и исходные данные в контексте spring, используя следующий beean:
<bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">
<property name="dataSource" ref="dataSource" />
<property name="changeLog" value="classpath:db/changelog/db.changelog-master.xml" />
<property name="dropFirst" value="true" />
</bean>
Я также использую плагин Maven Liquibase для создания sql-скриптов, чтобы увидеть, какие таблицы созданы и т.д.
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>2.0.5</version>
<configuration>
<!--mvn initialize liquibase:updateSQL-->
<propertyFile>src/main/resources/db/config/liquibase-gensql-data-access.properties</propertyFile>
<changeLogFile>src/main/resources/db/changelog/db.changelog-master.xml</changeLogFile>
</configuration>
</plugin>
Файл db.changelog-master.xml
включает в себя файлы изменений changilog для детей. Проблема, как обращаться к ним от мастера. Когда я использую spring, я должен использовать следующий путь через путь к классам:
<include file="classpath:/db/changelog/db.changelog-1.0.xml"/>
Когда используется Maven, путь следующий:
<include file="src/main/resources/db/changelog/db.changelog-1.0.xml"/>
Я хотел бы иметь ту же конфигурацию для обоих случаев. Как я могу архивировать его?
Ответы
Ответ 1
Я прокомментировал ответ Игоря, его решение, похоже, не работает.
Чтобы решить эту проблему, я просто нажал патч на Liquibase: https://github.com/liquibase/liquibase/pull/187. Это должно быть объединено в 3.0.6-SNAPSHOT и поэтому доступно в 3.0.6.
С помощью этого изменения теперь вы можете настроить SpringLiquibase
на эту дополнительную строку:
<property name="ignoringClasspathPrefix" value="true" />
Другой пример /usecase, требующий этого изменения, можно найти здесь: https://github.com/LateralThoughts/spring-liquibase-extensions.
Ответ 2
Я думаю, что если вы измените свой путь Maven от
<changeLogFile>src/main/resources/db/changelog/db.changelog-master.xml</changeLogFile>
к
<changeLogFile>db/changelog/db.changelog-master.xml</changeLogFile>
и обновите файл db.changelog-master.xml для всех включенных файлов, чтобы использовать путь относительно каталога src/main/resources, он устранит проблему.
Я решил эту проблему, используя тот же путь к файлам changeLog в Spring, maven и тесте интеграции, который вызывает Liquibase. Все мои файлы изменений находятся в каталоге /src/main/resources/db в одном из модулей Maven в проекте.
Профиль Maven, который запускает Liquibase, указывает путь: db/masterChangeLog.xml
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>*** Install a last major release version of db ***</id>
<phase>process-resources</phase>
<goals>
<goal>update</goal>
</goals>
<configuration>
<changeLogFile>db/masterChangeLog.xml</changeLogFile>
<contexts>dbBuildContext, dmlDevContext</contexts>
<propertyFile>db/liquibase-${user.name}.properties</propertyFile>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
<logging>debug</logging>
</configuration>
</execution>
Файл db/masterChangeLog.xml содержит следующие файлы:
<include file="db/install.xml"/>
<include file="db/update.xml"/>
Файл db/install.xml содержит другие файлы изменений (так же update.xml):
<includeAll path="db/install/seq"/>
<includeAll path="db/install/tab"/>
<includeAll path="db/install/cst"/>
<includeAll path="db/latest/vw" />
Контекст Spring выполняет один и тот же набор сценариев db при запуске приложения следующим образом:
<bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">
<property name="dataSource" ref="baseCostManagementDataSource" />
<property name="changeLog" value="classpath:db/masterChangelog.xml" />
<property name="contexts" value="dbBuildContext, dmlDevContext" />
</bean>
Ответ 3
Укажите атрибут logicalFilePath в каждом файле databaseChangeLog. См. http://www.liquibase.org/documentation/databasechangelog.html
Ответ 4
Плагин Maven имеет свойство конфигурации changeLogDirectory в последних версиях.
Следовательно, установка <changeLogDirectory>src/main/resources</changeLogDirectory>
должна достичь того, что вы хотите.