Как использовать Liquibase для обновления базы данных во встроенном экземпляре Glassfish
Я нахожусь в процессе преобразования нашего управления БД в Liquibase. Это хорошо работает.
В качестве следующего шага я хочу убедиться, что все будущие модификации будут проверены перед развертыванием в общих средах, стиль непрерывной интеграции. Я пытаюсь сделать это, используя следующую настройку:
- Создайте наше ухо, содержащее веб-сервисы EJB
- С помощью
maven-embedded-glassfish-plugin
запустить встроенный экземпляр Glassfish 3 во время предварительного тестирования maven ohase- Создать мой источник данных как часть начальной цели
- Развернуть ухо во время развертывания цели
- Все еще в предварительном тесте интеграции, я запускаю liquibase: обновление по тому же URL базы данных. В этом случае база данных файла H2
- Затем я хочу запустить наши тесты SoapUI на развернутом приложении
Но когда я зашел так далеко, приложение не может найти никаких данных в базе данных. Таким образом, вопрос в том, пропустил ли я что-то в своей настройке или есть лучший способ организовать мою намеченную цель?
pom.xml, встроенный Glassfish
<plugin>
<groupId>org.glassfish.embedded</groupId>
<artifactId>maven-embedded-glassfish-plugin</artifactId>
<version>4.0</version>
<configuration>
<ports>
<http-listener>9090</http-listener>
<https-listener>9191</https-listener>
</ports>
<goalPrefix>embedded-glassfish</goalPrefix>
<app>${project.build.directory}/school-application-${project.version}.ear</app>
<name>school-application</name>
<commands>
<command>create-jdbc-connection-pool --datasourceclassname=org.h2.jdbcx.JdbcDataSource --restype=javax.sql.DataSource --property URL=jdbc\:h2\:~/tmpLB\;AUTO_SERVER\=TRUE schoolDSPool</command>
<command>create-jdbc-resource --connectionpoolid schoolDSPool jdbc/schoolDS</command>
</commands>
</configuration>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.176</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>start</goal>
<goal>admin</goal>
<goal>deploy</goal>
<goal>undeploy</goal>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
pom.xml, Liquibase
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.1.1</version>
<dependencies>
<dependency>
<groupId>company.school</groupId>
<artifactId>school-db</artifactId>
<version>${project.version}</version>
<systemPath>../school-db/target</systemPath>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.176</version>
</dependency>
</dependencies>
<executions>
<execution>
<phase>integration-test</phase>
<configuration>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
<changeLogFile>db.changelog-master.xml</changeLogFile>
<driver>org.h2.Driver</driver>
<url>jdbc:h2:~/tmpLB;AUTO_SERVER=TRUE</url>
<logging>info</logging>
</configuration>
<goals>
<goal>update</goal>
</goals>
</execution>
</executions>
</plugin>
У меня есть один набор изменений в журнале изменений, вставляющий данные в целевые таблицы.
- Правильно ли настроены пользователи?
- Есть ли способ запустить Liquibase в том же процессе, что и Glassfish и использовать
mem:
вместо базы данных?
Спасибо и привет, Кристиан
1 ответ
Итак, было "простое" решение проблемы.
В базе данных не было данных, так как этот набор изменений в журнале изменений не мог завершиться. У меня были операторы вставки в отдельный файл SQL, который я вызвал с помощью <sqlFile>
Жидкостная метка. Но вставка нарушила некоторые ограничения внешнего ключа и не была выполнена.
Поэтому меня поразил тот факт, что Liquibase, похоже, скрывает любые ошибки из включенных файлов sql. Постараюсь воспроизвести это, и Джира это, если мне удастся.
/ Христианская