Используя пути файла 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>

Ответ 4

Плагин Maven имеет свойство конфигурации changeLogDirectory в последних версиях.

Следовательно, установка <changeLogDirectory>src/main/resources</changeLogDirectory> должна достичь того, что вы хотите.