使用两个数据库的maven的liquibase无法正常工作 [英] liquibase using maven with two databases does not work

查看:77
本文介绍了使用两个数据库的maven的liquibase无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这篇文章描述了如何使用liquibase从maven更新两个数据库: 使用带有两个数据库的maven的liquibase 但是,当我在pom.xml(包括在下面)中尝试完全相同的配置时,它不起作用.运行'mvn liquibase:update'时出现此错误:

This post describes how to update two databases from maven using liquibase: liquibase using maven with two databases However, when I try the exact same configuration in my pom.xml (included below) it does not work. I get this error when running 'mvn liquibase:update':

The driver has not been specified either as a parameter or in a properties file.

将verbose设置为true即可运行:

Running with verbose set to true I get:

[INFO] Settings----------------------------
[INFO]     driver: null
[INFO]     url: null
[INFO]     username: null
[INFO]     password: null

因此,该配置似乎没有传递给liquibase.如果 configuration 部分在 executions 之外,它可以工作,但是那使执行多次执行的想法破灭了-您可能希望对不同的执行使用不同的配置.

so looks like the configuration is not being passed to liquibase. If the configuration part is outside executions it works, but that defeats the whole idea of having multiple executions - you would want to use different configurations for different executions.

  <plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-plugin</artifactId>
    <version>1.9.5.0</version>

    <executions>
      <execution>
        <phase>process-resources</phase>
        <id>one</id>
        <goals>
          <goal>update</goal>
        </goals>
        <configuration>
          <changeLogFile>src/main/resources/liquibase/changelog-master.xml</changeLogFile>
          <driver>com.mysql.jdbc.Driver</driver>
          <url>jdbc:mysql://127.0.0.1:3306/${database.development}</url>
          <username>wifi_offload_app</username>
          <password />
          <dropFirst>${liquibase.dropFirst}</dropFirst>
        </configuration>
      </execution>
      <execution>
        <phase>process-resources</phase>
        <id>two</id>
        <goals>
          <goal>update</goal>
        </goals>
        <configuration>
          <changeLogFile>src/main/resources/liquibase/changelog-master-sbr.xml</changeLogFile>
          <driver>com.mysql.jdbc.Driver</driver>
          <url>jdbc:mysql://127.0.0.1:3307/${database.development.sbr}</url>
          <username>wifi_offload_app</username>
          <password />
          <dropFirst>${liquibase.dropFirst}</dropFirst>
        </configuration>
      </execution>
    </executions>

    <dependencies>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.12</version>
      </dependency>
    </dependencies>
  </plugin>

谢谢, 哈里

尝试使用Mark的注释中的"mvn process-resources"进行更新.这是mvn更新两个数据库的输出.

Update after trying 'mvn process-resources' from Mark's comment. Here's the output from mvn updating both databases.

[hariharan@msg9]$ mvn process-resources
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Offload Manager Service
[INFO]    task-segment: [process-resources]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 12 resources
[INFO] [liquibase:update {execution: one}]
[INFO] ------------------------------------------------------------------------
[INFO] Executing on Database: jdbc:mysql://127.0.0.1:3306/db1
Mar 7, 2012 4:11:47 PM liquibase.database.template.JdbcTemplate comment
INFO: Create Database Lock Table
Mar 7, 2012 4:11:47 PM liquibase.database.template.JdbcTemplate comment
INFO: Lock Database
Mar 7, 2012 4:11:47 PM liquibase.lock.LockHandler acquireLock
INFO: Successfully acquired change log lock
Mar 7, 2012 4:11:47 PM liquibase.database.template.JdbcTemplate comment
INFO: Create Database Change Log Table
Mar 7, 2012 4:11:47 PM liquibase.database.AbstractDatabase checkDatabaseChangeLogTable
INFO: Creating database history table with name: `DATABASECHANGELOG`
Mar 7, 2012 4:11:48 PM liquibase.database.AbstractDatabase getRanChangeSetList
INFO: Reading from `DATABASECHANGELOG`
Mar 7, 2012 4:11:48 PM liquibase.database.template.JdbcTemplate comment
INFO: Changeset liquibase/changelogs/1328053095_tables.xml::1328053095-1::hariharan::(MD5Sum: bf33ef8ba7352e8c0864e9457ee642b)
Mar 7, 2012 4:11:49 PM liquibase.database.template.JdbcTemplate comment
INFO: Changeset liquibase/changelogs/1328053095_tables.xml::1328053095-2::hariharan::(MD5Sum: 7cc4f84be549dbcea3589d85df3e059)
Mar 7, 2012 4:11:50 PM liquibase.database.template.JdbcTemplate comment
INFO: Changeset liquibase/changelogs/1328053095_tables.xml::1328053095-3::hariharan::(MD5Sum: 59821447f5744410a1c36bccd16196f6)
Mar 7, 2012 4:11:50 PM liquibase.database.template.JdbcTemplate comment
INFO: Release Database Lock
Mar 7, 2012 4:11:50 PM liquibase.lock.LockHandler releaseLock
INFO: Successfully released change log lock
Mar 7, 2012 4:11:50 PM liquibase.database.template.JdbcTemplate comment
INFO: Release Database Lock
Mar 7, 2012 4:11:50 PM liquibase.lock.LockHandler releaseLock
INFO: Successfully released change log lock
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] [liquibase:update {execution: two}]
[INFO] ------------------------------------------------------------------------
[INFO] Executing on Database: jdbc:mysql://127.0.0.1:3307/db2
Mar 7, 2012 4:11:50 PM liquibase.database.template.JdbcTemplate comment
INFO: Create Database Lock Table
Mar 7, 2012 4:11:50 PM liquibase.database.template.JdbcTemplate comment
INFO: Lock Database
Mar 7, 2012 4:11:50 PM liquibase.lock.LockHandler acquireLock
INFO: Successfully acquired change log lock
Mar 7, 2012 4:11:50 PM liquibase.database.template.JdbcTemplate comment
INFO: Create Database Change Log Table
Mar 7, 2012 4:11:50 PM liquibase.database.AbstractDatabase checkDatabaseChangeLogTable
INFO: Creating database history table with name: `DATABASECHANGELOG`
Mar 7, 2012 4:11:50 PM liquibase.database.AbstractDatabase getRanChangeSetList
INFO: Reading from `DATABASECHANGELOG`
Mar 7, 2012 4:11:50 PM liquibase.database.template.JdbcTemplate comment
INFO: Changeset liquibase/changelogs-sbr/1330991147_tables.xml::1330991147-1::hariharan::(MD5Sum: 8cf69599bcf338b57d7fe1ecc1471d86)
Mar 7, 2012 4:11:50 PM liquibase.database.template.JdbcTemplate comment
INFO: Changeset liquibase/changelogs-sbr/1330991147_tables.xml::1330991147-2::hariharan::(MD5Sum: cf9a9717987fda5deba07a7a943673e1)
Mar 7, 2012 4:11:50 PM liquibase.database.template.JdbcTemplate comment
INFO: Release Database Lock
Mar 7, 2012 4:11:50 PM liquibase.lock.LockHandler releaseLock
INFO: Successfully released change log lock
Mar 7, 2012 4:11:50 PM liquibase.database.template.JdbcTemplate comment
INFO: Release Database Lock
Mar 7, 2012 4:11:50 PM liquibase.lock.LockHandler releaseLock
INFO: Successfully released change log lock
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6 seconds
[INFO] Finished at: Wed Mar 07 16:11:50 PST 2012
[INFO] Final Memory: 23M/180M
[INFO] ------------------------------------------------------------------------

推荐答案

您的构建是否需要一次性更新2个数据库?另一种方法是使用Maven配置文件,如下所示:

Does your build need to update 2 databases in one go? An alternative approach is to use Maven profiles as follows:

mvn process-resources
mvn -Pdb2 process-resources

项目文件

|-- pom.xml
`-- src
    `-- main
        `-- resources
            |-- com
            |   `-- myspotontheweb
            |       `-- db
            |           `-- changelog
            |               |-- db-changelog-1.0.xml
            |               `-- db-changelog-master.xml
            `-- liquibase.properties

我更喜欢使用Maven的 generate-resources 阶段来创建一个liquibase属性文件.

I prefer to use Maven's generate-resources phase to create a liquibase properties file.

在末尾包含两个配置文件,其中包含与两个数据库关联的属性.该解决方案可以扩展到任意数量的数据库环境.

Contains two profiles at the end containing the properties associated with the two databases. This solution scales to any number of db environments.

另一项需要注意的地方是liquibase使用 targets 目录下的填充属性

Another item of note is that liquibase uses the populated properties under the targets directory

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.myspotontheweb.db</groupId>
    <artifactId>liquibase-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.3.162</version>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-maven-plugin</artifactId>
                <version>2.0.1</version>
                <executions>
                    <execution>
                        <phase>process-resources</phase>
                        <configuration>
                            <propertyFile>target/classes/liquibase.properties</propertyFile>
                            <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
                        </configuration>
                        <goals>
                            <goal>update</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <profiles>
        <profile>
            <id>db1</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <liquibase.url>jdbc:h2:target/db1/liquibaseTest;AUTO_SERVER=TRUE</liquibase.url>
                <liquibase.driver>org.h2.Driver</liquibase.driver>
                <liquibase.username>user</liquibase.username>
                <liquibase.password>pass</liquibase.password>
            </properties>
        </profile>
        <profile>
            <id>db2</id>
            <properties>
                <liquibase.url>jdbc:h2:target/db2/liquibaseTest;AUTO_SERVER=TRUE</liquibase.url>
                <liquibase.driver>org.h2.Driver</liquibase.driver>
                <liquibase.username>user</liquibase.username>
                <liquibase.password>pass</liquibase.password>
            </properties>
        </profile>
    </profiles>
</project>

liquibase.properties

这是模板文件,其中填充了特定环境的配置文件属性值.

liquibase.properties

This is the template file populated with the profile property values for the specific environment.

# Database credentials
url=${liquibase.url}
driver=${liquibase.driver}
username=${liquibase.username}
password=${liquibase.password}

# Liquibase changelog
changeLogFile=com/myspotontheweb/db/changelog/db-changelog-master.xml


更新

另一种策略是直接运行该插件,而不是将其集成到Maven生命周期中.


Update

And alternative strategy would be to run the plug-in directly, instead of integrating it into a Maven life-cycle.

mkdir target
mvn liquibase:update
mvn -Pdb2 liquibase:update

同样,您使用配置文件来控制属性设置.

Again you are using a profile to control the property settings.

区别在于,插件设置由配置文件中设置的属性控制.在目标目录下不再创建任何属性文件,可将其发送到您的jar中.

The difference is that the plug-ins settings are controlled by properties set in the profile. No more properties file created under the targets directory for shipment in your jar.

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.myspotontheweb.db</groupId>
    <artifactId>liquibase-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.3.162</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-maven-plugin</artifactId>
                <version>2.0.1</version>
                <configuration>
                    <url>${liquibase.url}</url>
                    <driver>${liquibase.driver}</driver>
                    <username>${liquibase.username}</username>
                    <password>${liquibase.password}</password>
                    <changeLogFile>src/main/resources/com/myspotontheweb/db/changelog/db-changelog-master.xml</changeLogFile>
                    <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <profiles>
        <profile>
            <id>db1</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <liquibase.url>jdbc:h2:target/db1/liquibaseTest;AUTO_SERVER=TRUE</liquibase.url>
                <liquibase.driver>org.h2.Driver</liquibase.driver>
                <liquibase.username>user</liquibase.username>
                <liquibase.password>pass</liquibase.password>
            </properties>
        </profile>
        <profile>
            <id>db2</id>
            <properties>
                <liquibase.url>jdbc:h2:target/db2/liquibaseTest;AUTO_SERVER=TRUE</liquibase.url>
                <liquibase.driver>org.h2.Driver</liquibase.driver>
                <liquibase.username>user</liquibase.username>
                <liquibase.password>pass</liquibase.password>
            </properties>
        </profile>
    </profiles>
</project>

这篇关于使用两个数据库的maven的liquibase无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆