问题描述
我正在尝试将Keycloak docker映像与非标准数据库(HANA-DB)一起使用。
按照documentation中所述修改配置可以正常工作,并且keycloak连接到数据库。剩下的问题似乎是Liquibase迁移无法运行,因为Liquibase不知道如何开箱即用地处理HANA-DB。
当然,有一个扩展库(https://mvnrepository.com/artifact/org.liquibase.ext/liquibase-hanadb/4.0.0),可将此功能添加到Liquibase。现在我的问题是:如何获得Keycloak的Liquibase来使用该库?
我已经尝试过:
- 将库打包到其自己的模块中,并在Keycloak的Liquibase模块中为其添加依赖项
- 将库作为第二个
resource-root
添加到Keycloak的Liquibase模块中
两者均无效,即Liquibase仍无法识别“ HDB”数据库。
正确的方法是什么?
解决方法
我确实做到了! 我实现它的方式并不完美,但是keycloak 11.0.2 Docker Image正在运行。 具有Hana和Liquibase的Keycloak正在迁移到Hana DB,目前正在运行,目前对我们的所有测试均已通过。
我只简单介绍一下我做了什么。也许为此写一些博客条目。
基本上,您的回答在某种程度上帮助了我,而且您的方向正确。 我做了什么:
- 为JBoss CLI引导脚本(https://medium.com/@victor.boaventura/keycloak-using-alternative-databases-e2b13576c457)创建另一个数据库供应商。
- Hana DB驱动程序还需要全局模块
/subsystem=ee:write-attribute(name="global-modules",value=[{"name" => "jdk.net","slot" => "main"},{"name" => "org.liquibase","slot" => "main"}])
(JBOSS CLI) - Keycloak不能自动发现正确的休眠方言,因此还必须添加它:
/subsystem=keycloak-server/spi=connectionsJpa/provider=default/:write-attribute(name=properties,value={"dataSource" => "java:jboss/datasources/KeycloakDS","initializeEmpty" => "true","driverDialect" => "org.hibernate.dialect.HANAColumnStoreDialect","migrationStrategy" => "update","migrationExport" => expression "${jboss.home.dir}/keycloak-database-update.sql"})
- 已将Liquibase模块更新为版本3.6.3,并在同一模块中添加了Liquibase Hana DB适配器3.9.0(https://github.com/liquibase/liquibase-hanadb)作为第二资源根。 (要使版本正常工作有点棘手)而且模块还需要对'org.slf4j'的另一个依赖才能使日志工作。
- 这时,我在'liquibase.ext'上尝试了Liquibase程序包扫描和Keycloaks排除。那就是为什么我必须添加SystemProp'liquibase.scan.packages'(谢谢您在这里:))
liquibase.scan.packages = org.keycloak.connections.jpa.updater.liquibase.lock,liquibase.change,liquibase.changelog,liquibase.database,liquibase.parser.core.xml,liquibase.precondition,liquibase.datatype ,liquibase.serializer.core.xml,liquibase.sqlgenerator,liquibase.executor,liquibase.snapshot,liquibase.logging,liquibase.diff,liquibase.structure,liquibase.structurecompare,liquibase.lockservice,liquibase.sdk.database,liquibase.ext
- 之后,Keycloak将Hana DB识别为Liquibase,并且开始了迁移。我当时非常高兴,但是一个问题解决了,下一个问题就出现了…… 由于某些SQL细节,
- 2个liquibase变更日志无法与Hana DB一起使用。这就是为什么我创建了两个补丁并将它们应用于keycloak-model-jpa模块的原因。基本上,他们已经为oracle处理了特殊情况(失败了),所以我只是在每个preCondition中都添加了“ hana”,提到了“ oracle”就可以了!
这基本上是我的解决方案。如果您有任何疑问,请随时在这里询问或与我联系。
,事实证明,将库作为第二个resource-root
添加到Keycloaks的liquibase模块中确实有效。它不会被加载,因为Keycloak从用于查找liquibase扩展的服务加载器中删除了liquibase.ext
。
不过,可以使用liquibase.scan.packages
系统属性来解决此问题。
对于所有试图使Keycloak与HANA配合使用的人:
- 覆盖
liquibase.scan.packages
系统属性会导致库被加载 - 现在,找不到在liquibase-hanadb库中引用的liquibase中的类(
LoggingService
),因为它是在liquibase 3.6中引入的,而Keycloak随3.5.5一起提供。 - 当将最新版本的liquibase(3.6.0)入侵到Keycloak的模块中时,由于某种原因,正在运行仅用于DB2的变更集,从而导致错误。我怀疑Keycloak的变更日志和更新的liquibase版本之间不兼容。
我在这一点上放弃了。