【问题标题】:Liquibase loadData changeset ignores contextLiquibase loadData 变更集忽略上下文
【发布时间】:2019-12-04 08:49:45
【问题描述】:

我有一个 jhipster 项目,一如既往地使用 Java、Spring 和 Liquibase。我只想在“dev”模式下加载模拟用户,但是当使用“prod”配置文件部署到 Heroku 时,它们也会被加载。就像 liquibase 完全忽略了上下文一样。我在这里做错了什么?

application-prod.yml 文件的 liquibase 上下文设置为“prod”

spring:
    liquibase:
        contexts: prod

application-dev.yml 将 liquibase 上下文设置为“dev”:

spring:
    liquibase:
        contexts: dev

我有一些模拟用户数据,我只想在 dev 上加载(在 localhost 上运行时),liquibase 变更集如下所示:

<changeSet author="me" id="mock-data-1" context="dev" >

        <loadData encoding="UTF-8"
                  file="config/liquibase/mock_users.csv"
                  separator=";"
                  tableName="jhi_user">
            <column name="activated" type="boolean"/>
            <column name="created_date" type="timestamp"/>
        </loadData>

        ...

</changeSet>

所有其他变更集都没有应用上下文。

(可能不相关但)我的 mock_users.csv 看起来像这样:

id;login;password_hash;first_name;last_name;email;image_url;activated;lang_key;created_by;last_modified_by;created_date;team_id
5;user1;$2a$10$VEjxo0jq2YG9Rbk2HmX9S.k1uZBGYUHdUcid3g/vfiEl7lwWgOH/K;;;user1@localhost.com;;true;sv;system;system;2019-12-03T09:21:06Z;1

这是我用于 Heroku 部署的 Procfile:

web: java $JAVA_OPTS -jar target/*.war --spring.profiles.active=prod,heroku --server.port=$PORT 
release: cp -R src/main/resources/config config && ./mvnw liquibase:update -Pheroku

当部署到 Heroku 时,日志显示根本没有设置上下文:

Liquibase settings:
...
2019-12-03T13:17:08.821255+00:00 app[release.7646]: [INFO]     context(s): null
...

整个 changeLog 都被执行了,我也可以在 Heroku 日志中看到。

如何确保正确使用 application-prod.yml 文件中的 liquibase 上下文?

EDIT* 我可以通过编辑 pom 文件,在“heroku”配置文件下,“liquibase maven 插件”设置“contexts”标签,让 heroku 在 prod 上下文中运行 liquibase:

<profile>
            <id>heroku</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.liquibase</groupId>
                        <artifactId>liquibase-maven-plugin</artifactId>
                        <configuration combine.self="override">
                            <changeLogFile>src/main/resources/config/liquibase/master.xml</changeLogFile>
                            <diffChangeLogFile>src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
                            <driver></driver>
                            <url>${env.JDBC_DATABASE_URL}</url>
                            <defaultSchemaName></defaultSchemaName>
                            <username>${env.JDBC_DATABASE_USERNAME}</username>
                            <password>${env.JDBC_DATABASE_PASSWORD}</password>
                            <referenceUrl>hibernate:spring:se.axesslab.respekttrappan.domain?dialect=org.hibernate.dialect.PostgreSQL82Dialect&amp;hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&amp;hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl>
                            <verbose>true</verbose>
                            <contexts>prod</contexts>
                            <logging>debug</logging>
                            <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
                        </configuration>
                    </plugin>

但这真的需要吗?那么让 application-*.yml 文件保存不同的 liquibase 上下文有什么意义呢?

【问题讨论】:

  • 为什么不用application.yml 而不是application-prod.yml
  • 或者你尝试设置,-Dspring.profiles.active=prod 作为 JVM 参数
  • @MohamedSaligh 因为我想要 dev、prod 和 test 的不同设置,并且我只使用 application.yml 进行常见设置。
  • @MohamedSalig 我这样做了,请参阅我的帖子。 "--spring.profiles.active=prod,heroku"
  • 建议使用 application.yml 剩余的 prod 配置将使用不同的配置文件,例如 'dev','test','qa'。还注意到您传递的 JVM 参数 web: java $JAVA_OPTS -jar target/*.war --spring.profiles.active=prod,heroku,不应该有类似 -Dspring.profiles.active=prod 的东西?我不确定 heroku 的工作原理,但是,JVM 参数在平台上的工作方式相同。仔细检查可能会解决问题。

标签: spring spring-boot jhipster liquibase


【解决方案1】:

Liquibase 的执行是从 Maven 插件./mvnw liquibase:update -Pheroku 中触发的。 maven 插件不知道你在 Spring 的属性文件中设置的 Liquibase 上下文。

就像你自己想的那样,你要么在 pom.xml 中设置上下文,要么让 Spring 执行 Liquibase。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-14
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多