【发布时间】: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&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 上下文有什么意义呢?
【问题讨论】:
-
为什么不用
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