Liquibase loadData 变更集忽略上下文

Liquibase loadData changeset ignores context

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

应用程序-prod.yml 文件的 liquibase 上下文设置为 "prod"

spring:
    liquibase:
        contexts: prod

并且应用程序-dev.yml 正在将 liquibase 上下文设置为 "dev":

spring:
    liquibase:
        contexts: dev

我有一些模拟用户数据,我只想在开发上加载(当在本地主机上 运行ning 时),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;a$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 日志中看到。

如何确保正确使用我的应用程序-prod.yml 文件中的 liquibase 上下文?

EDIT* 我可以通过编辑 pom 文件,在 "heroku" 配置文件下,"liquibase maven plugin" 使 heroku 运行 liquibase 具有生产环境设置 "contexts" 标签:

<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 上下文有什么意义呢?

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

就像您自己发现的那样,您必须在 pom.xml 中设置上下文或让 Spring 执行 Liquibase。