liquibase-maven-plugin 与 testcontainers 的使用

The usage of liquibase-maven-plugin with testcontainers

假设我有这个插件配置(使用 hsqldb):

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>3.4.1</version>
    <executions>
        <execution>
            <id>build</id>
            <phase>generate-test-resources</phase>
            <goals>
                <goal>update</goal>
            </goals>
            <configuration>
                <changeLogFile>${basedir}/src/main/resources/liquibase/db.changelog-master.xml
                </changeLogFile>
                <driver>org.hsqldb.jdbc.JDBCDriver</driver>
                <url>jdbc:hsqldb:file:${project.build.directory}/hsqldb/sample;shutdown=true</url>
                <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
                <logging>off</logging>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>2.5.2</version>
        </dependency>
    </dependencies>
</plugin>

我想将 hsqldb 更改为 postgres。我想这里可以使用 testcontainers 。但是我无法正确设置它。

如果可能的话,谁能帮忙做一下示例配置?或者也许还有其他解决方案?

注意:我目前在另一个插件 (schemacrawler) 中使用这个数据库,所以没有使用 java 代码,它与单元测试无关。

您可以通过一小段 groovy-maven-plugin 使用 Testcontainers,例如,以下将启动 Postgres 容器:

<plugin>
  <groupId>org.codehaus.gmaven</groupId>
  <artifactId>groovy-maven-plugin</artifactId>
  <version>2.1.1</version>
  <executions>
    <execution>
      <!-- Start the container in any phase before the actual code
           generation is required, i.e. at the latest in
           generate-sources -->
      <phase>generate-sources</phase>
      <goals>
        <goal>execute</goal>
      </goals>
      <configuration>
        <source>
          db = new org.testcontainers.containers.PostgreSQLContainer(
                  "postgres:latest")
            .withUsername("${db.username}")
            .withDatabaseName("postgres")
            .withPassword("${db.password}");
             
          db.start();
 
          // After you've started the container, collect its generated
          // JDBC URL (which contains a random port)
          project.properties.setProperty('db.url', db.getJdbcUrl());
        </source>
      </configuration>
    </execution>
  </executions>
   
  <dependencies>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>postgresql</artifactId>
    </dependency>
  </dependencies>
</plugin>

此示例缺少正常关机。它也取自 jOOQ 文章,关于如何使用 Testcontainers 从数据库模式生成 Java 类:https://blog.jooq.org/using-testcontainers-to-generate-jooq-code