Использование встроенной базы данных с Flyway и jOOQ в Maven для непрерывной интеграции

Поэтому я действительно пытаюсь делать все «правильно» с SQL, который сломается во время компиляции с использованием flyway и jOOQ. Для этого мне нужно решение для базы данных, которое может работать на сервере непрерывной интеграции без доступа к какой-либо серверной базе данных. . В конечном счете, я хочу развернуть это на Amazon, поэтому мне нужно решение, в основном совместимое с постгресSQL. файловый протокол HSQLDB, кажется, соответствует этим требованиям.

<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">

<properties>
    <schema></schema>
    <db.groupId>org.hsqldb</db.groupId>
    <db.artifactId>hsqldb</db.artifactId>
    <db.version>2.3.2</db.version>
    <flyway.url>jdbc:hsqldb:file:myDB/db</flyway.url>
    <flyway.driver>org.hsqldb.jdbcDriver</flyway.driver>
    <jooq.generator.database.name>org.jooq.util.hsqldb.HSQLDBDatabase</jooq.generator.database.name>
    <flyway.user></flyway.user>
    <flyway.password></flyway.password>

</properties>

<dependencies>
    <dependency>
        <groupId>${db.groupId}</groupId>
        <artifactId>${db.artifactId}</artifactId>
        <version>${db.version}</version>
    </dependency>
    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jooq</artifactId>
        <version>3.4.2</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-maven-plugin</artifactId>
            <version>3.1</version>

            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>migrate</goal>
                    </goals>
                </execution>
            </executions>

            <configuration>
                <locations>
                    <location>filesystem:src/main/resources/db/migration</location>
                </locations>
            </configuration>
        </plugin>
        <plugin>

            <!-- Specify the maven code generator plugin -->
            <groupId>org.jooq</groupId>
            <artifactId>jooq-codegen-maven</artifactId>
            <version>3.4.2</version>

            <!-- The plugin should hook into the generate goal -->
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>

            <!-- Work around Maven's classloader -->
            <dependencies>
                <dependency>
                    <groupId>${db.groupId}</groupId>
                    <artifactId>${db.artifactId}</artifactId>
                    <version>${db.version}</version>
                </dependency>
            </dependencies>

            <configuration>

                <!-- JDBC connection parameters -->
                <jdbc>
                    <driver>${flyway.driver}</driver>
                    <url>${flyway.url}</url>
                    <user>${flyway.user}</user>
                    <password>${flyway.password}</password>
                </jdbc>

                <!-- Generator parameters -->
                <generator>
                    <name>org.jooq.util.DefaultGenerator</name>
                    <database>
                        <name>${jooq.generator.database.name}</name>
                        <includes>.*</includes>
                        <excludes></excludes>
                        <inputSchema>${schema}</inputSchema>
                    </database>
                    <target>
                        <packageName>package.goes.here</packageName>
                        <directory>target/generated-sources/jooq</directory>
                    </target>
                </generator>
            </configuration>
        </plugin>
    </plugins>
</build>

The problem is that Flyway can create the database fine, but when it becomes jOOQ's turn to use the database to generate code, it fails with:

Caused by: org.hsqldb.HsqlException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@1096ec89[file =...db/db.lck, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2015-02-09 03:56:15 heartbeat - read: -863 ms.
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.persist.LockFile.newLockFileLock(Unknown Source)
at org.hsqldb.persist.Logger.acquireLock(Unknown Source)
at org.hsqldb.persist.Logger.open(Unknown Source)
at org.hsqldb.Database.reopen(Unknown Source)
at org.hsqldb.Database.open(Unknown Source)
at org.hsqldb.DatabaseManager.getDatabase(Unknown Source)
at org.hsqldb.DatabaseManager.newSession(Unknown Source)

Суть проблемы в том, что плагины Maven не используют тот же загрузчик классов, что и остальные. POM, и вы должны указать зависимость драйвера JDBC во второй раз. Таким образом, я получаю новый экземпляр драйвера, и он конфликтует с уже открытым драйвером, который открыл Flyway, вместо того, чтобы использовать тот же самый.

Таким образом, решение может существовать по нескольким различным путям:

  1. Flyway может корректно закрыть базу данных. По-видимому, у Flyway есть обходной путь в своем плагине для чтения пути к классам проекта.
  2. jOOQ можно как-то настроить для чтения пути к классам проекта.
  3. Возможно, есть другая база данных, которая будет работать лучше.
  4. Ваш!

person user2957009    schedule 09.02.2015    source источник
comment
немного неубедительно: создайте отдельную JVM для некоторых задач Maven.   -  person Thilo    schedule 09.02.2015
comment
Такая же проблема недавно возникла у другого пользователя, использующего встроенный Derby: github.com/jOOQ/jOOQ/issues/ 4007   -  person Lukas Eder    schedule 09.02.2015


Ответы (1)


Спасибо Тило за направление. Замена плагина Flyway на exec работает, но мне пришлось создать более простой клиент командной строки чтобы это работало.

person user2957009    schedule 09.02.2015