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&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&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。
我有一个 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&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&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。