我在使用Active Directory身份验证对azure sql数据库执行更新时遇到了一些麻烦。
我得到的具体错误是
Unexpected error running Liquibase: Connection could not be created to jdbc:sqlserver://REDACTED.database.windows.net:1433;database=REDACTED;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;authentication=ActiveDirectoryPassword with driver com.microsoft.sqlserver.jdbc.SQLServerDriver. Failed to load MSAL4J Java library for performing ActiveDirectoryPassword authentication.
根据Liquibase的文档,我试图将MSAL4J jar及其依赖项加载到类路径中,但无济于事。下面是我的脚本:
$path = $repositoryPath -replace '\','/'
$internalVolumeMap = "$path/db:/liquibase/changelog" -replace '\','/'
$internalResourceMap = "$path/db/resources:/liquibase/classpath" -replace '\','/'
$connectionString = "jdbc:sqlserver://REDACTED.windows.net:1433;database=REDACTED;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;authentication=ActiveDirectoryPassword"
docker run --rm `
-v $internalResourceMap `
-v $internalVolumeMap `
liquibase/liquibase:4.5.0 `
--url=$connectionString `
--changeLogFile=/liquibase/changelog/liquibaseChangeLog.json `
--username=REDACTED `
--password="REDACTED" `
--classpath="/liquibase/changelog:/liquibase/classpath/msal4j-1.11.0.jar" `
update
有一堆关于如何在不使用docker的情况下获得此工作的信息-但我没有遇到太多利用liquibase docker映像的示例。所以这是一种猜测,也许有人以前遇到过这种情况,或者以前做过这种事情,可以为我指出正确的方向。
虽然您可能不再需要这个了,但我想发布一个适用于我们构建过程的解决方案。
我们在ActiveDirectoryServicePrincipal
认证中遇到了类似的问题,但同样的问题应该适用于其他形式的AAD认证。
Liquibase不包括Msal4j.jar
或所需的依赖项。您需要从外部源获取这些文件,例如:https://mvnrepository.com/artifact/com.microsoft.azure/msal4j.
最简单的方法是让maven在build -dependency:copy-dependencies
中复制本地的依赖项,目标是pom.xml
文件,像这样。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.com</groupId>
<artifactId>company-artifact-id</artifactId>
<version>1</version>
<dependencies>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>msal4j</artifactId>
<version>1.13.5</version>
</dependency>
</dependencies>
</project>
我们正在使用最新的docker镜像(4.20)。
docker run
liquibase/liquibase:4.20
--rm
-v "build_artifact:/liquibase/changelog"
-v "build_artifact/target/dependency:/liquibase/lib"
--url="url"
--changeLogFile="changeLogFile.xml"
--username="username"
--password="password"
update
这一行是maven下载的liquibase/lib
中的依赖项:
-v "build_artifact/target/dependency:/liquibase/lib"