在Java代码中运行liquibase

由于某种原因,没有关于在Java代码中运行liquibase的文档。 我想为unit testing生成表。

我将如何直接在Java中运行它?

例如

Liquibase liquibase = new Liquibase() liquibase.runUpdates() ? 

它应该是类似的(取自liquibase.integration.spring.SpringLiquibase源码):

 java.sql.Connection c = YOUR_CONNECTION; Liquibase liquibase = null; try { Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(c)) liquibase = new Liquibase(YOUR_CHANGELOG, new FileSystemResourceAccessor(), database); liquibase.update(); } catch (SQLException e) { throw new DatabaseException(e); } finally { if (c != null) { try { c.rollback(); c.close(); } catch (SQLException e) { //nothing to do } } } 

ResourceAccessor有多种实现方式,具体取决于您应该如何找到更改日志文件。

我找到了一种使用maven或Java实现数据库设置的方法。 上面的例子使用了FileSystemResourceAccessor() ,遗憾的是,如果你部署了一个需要从jar本身设置数据库的应用程序,那么你最终必须将jar解压缩为zip作为解决方法,因为这些liquibase文件只存在于jar中。 这意味着您的jar最终不可移植,并且您必须拥有maven无论您想要设置数据库。

使用此结构:

src/main/resources/liquibase/db.changelog-master.xml src/main/resources/liquibase/changelogs/...

您的DB changelog主机可能如下所示:

      

您可以将此部分用于pom.xml,以确保mvn install还将设置您的liquibase DB。

  org.liquibase liquibase-maven-plugin 3.5.1  liquibase/db.changelog-master.xml org.postgresql.Driver ${jdbc.url} ${jdbc.username} ${jdbc.password}    process-resources  update     

使用ClassLoaderResourceAccessor()而不是FileSystemResourceAccessor()

 public static void runLiquibase() { Liquibase liquibase = null; Connection c = null; try { c = DriverManager.getConnection(DataSources.PROPERTIES.getProperty("jdbc.url"), DataSources.PROPERTIES.getProperty("jdbc.username"), DataSources.PROPERTIES.getProperty("jdbc.password")); Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(c)); log.info(DataSources.CHANGELOG_MASTER); liquibase = new Liquibase(DataSources.CHANGELOG_MASTER, new ClassLoaderResourceAccessor(), database); liquibase.update("main"); } catch (SQLException | LiquibaseException e) { e.printStackTrace(); throw new NoSuchElementException(e.getMessage()); } finally { if (c != null) { try { c.rollback(); c.close(); } catch (SQLException e) { //nothing to do } } } }