设置 ADAL/MSAL 以使用 Matlab 连接到 Azure 数据库
Setting up ADAL/MSAL for connecting to Azure database with Matlab
使用 Matlab 及其数据库工具箱,我需要连接到使用 Microsoft SQL 的 Azure 服务器,使用 Azure ActiveDirectoryPassword
身份验证模式。但是,本机不支持 Azure 活动目录连接,需要一些额外的步骤。 Matlab 使用 Java,因此我需要通过 Java 驱动程序和库来建立与我的数据库的连接。在我尝试解决此问题的最新迭代中,我遇到了以下连接错误:JDBC Driver Error: Failed to load ADAL4J Java library for performing ActiveDirectoryPassword authentication.
通过这个有点相关的问题:https://forum.knime.com/t/connect-to-azure-database/20585, I was referred to the Microsoft page on how to setup the connection: https://docs.microsoft.com/en-us/sql/connect/jdbc/connecting-using-azure-active-directory-authentication?view=sql-server-ver15。此页面上的说明告诉我 On the client machine (on which, you want to run the example), download the azure-activedirectory-library-for-java library and its dependencies, and include them in the Java build path
.
随后,Microsoft 网页将我转到 Github 页面,以安装 ADAL 库。
现在,混乱仍在继续,因为我对下一步该做什么一无所知。我不知道任何 Java,我什至没有直接使用 Java,因为一切都是通过在后台使用 Java 的 Matlab 功能运行的(我唯一做的就是使用连接URL 设置与数据库的连接)。 ADAL/MSAL Github 上的帮助文件对于像我这样的新手来说不是很清楚,而且似乎并不专注于帮助简单的 Windows 用户设置所有库。所以我正在寻求帮助以获得一切 运行.
目前运行是什么?
- 操作系统:Windows 10 64 位服务器基础架构
- Java: 在有问题的电脑上安装 AdoptOpenJDK Java,版本
jdk-8.0.265.01-hotspot
- Matlab:我需要两个设置才能开始工作,Matlab 2017a 和 Matlab 2020a。 Matlab 2017a 最多只支持 Java 7,而 Matlab 2020a 最多支持 Java 8。Java 的(某些部分)似乎也随 Matlab 一起提供。在 Matlab 中使用
version -java
命令,我获得了以下信息:
- Matlab 2017a:
Java 1.7.0_60-b19 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
- Matlab 2020a:
Java 1.8.0_202-b08 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
- JDBC-驱动程序:通过 Microsoft JDBC 我下载了两个版本的 JDBC 驱动程序:
Microsoft JDBC DRIVER 6.4 for SQL Server
和 Microsoft JDBC DRIVER 8.4 for SQL Server
。 Matlab 2017a 将使用驱动程序 6.4(因为它使用 Java 7)而 Matlab 2020a 将使用驱动程序 8.4.
我的问题:
我尝试了什么:
- 我 downloaded the .jar file for MSAL and included it in the
javaclasspath
of Matlab,希望这将包括 Matlab-Java 中的 MSAL 库。不幸的是,这不起作用。
- 我查看了 ADAL github,试图弄清楚如何将其集成到 Java 中。但是我不明白如何做到这一点。
任何帮助将不胜感激,谢谢!
在向 MathWorks 进一步询问后,我能够解决我的问题。主要问题是我缺少 ADAL 库及其所有依赖项。安装它们之后,我能够连接到数据库。最后,这是让一切正常运行的设置。
- Java: 起初我们安装了 AdoptOpenJDK Java,但那是一个错误,没有必要
- 我做了什么:我回滚到原生 Matlab Java。我删除了环境变量中对新 Java 的所有引用,这样 Matlab 只能使用它附带的默认 Java。
- JDBC 驱动程序:是否必须使用 JDBC 驱动程序,或者您是否也可以使用 ODBC 连接?我不完全知道这个问题的答案。在 Matlab 中,似乎如果您想通过脚本以编程方式连接到数据库,您 need/want 可以使用 JDBC 驱动程序。虽然 MathWorks 支持人员没有明确说明,但他们也不建议使用 ODBC
- 我做了什么:使用最新的 JDBC 驱动程序,它仍然支持默认的 Java 版本的 Matlab,
Microsoft JDBC DRIVER 6.4 for SQL Server
for Matlab 2017a(它仍然使用 Java 7 ) 和 Microsoft JDBC DRIVER 8.4 for SQL Server
用于 Matlab 2020a(它使用 Java 8)
- ADAL 库:Matlab 需要 ADAL4J 库及其所有依赖项。由此我得出结论,使用 MSAL4J 是不可能的。我直接从 MathWork 获得了必要的库,所以我不知道如何获得它们。我使用的库是:
accessors-smart-1.2.jar
activation-1.1.jar
adal4j-1.6.3.jar
asm-5.0.4.jar
commons-codec-1.11.jar
commons-lang3-3.5.jar
gson-2.8.0.jar
javax.mail-1.6.1.jar
javax.servlet-api-4.0.1.jar
jcip-annotations-1.0-1.jar
json-smart-2.3.jar
lang-tag-1.5.jar
nimbus-jose-jwt-9.0.1.jar
oauth2-oidc-sdk-5.64.4.jar
slf4j-api-1.7.21.jar
答案的 Java/driver 相关部分到此结束。要在 Matlab 中设置所有内容,必须执行以下步骤。
- Matlab 需要知道 JDBC 驱动程序的安装位置以及 ADAL4J 库的位置
- 每个 Matlab 会话,您需要覆盖 Matlab 设置以避免 Matlab 强制 third-party Java 类 使用较旧的 Saxon Transformer。这个较旧的 Saxon Transformer 与 ADAL4J 不兼容。
解决方案:
- 在 Matlab 中执行命令
edit(fullfile(prefdir,'javaclasspath.txt'))
。如果该文件尚不存在,系统将提示您创建该文件。在这种情况下允许 Matlab 创建文件。
- 在 .txt 文件中,输入以下行:
<before>
c:\full\path\to\accessors-smart-1.2.jar
c:\full\path\to\activation-1.1.jar
c:\full\path\to\adal4j-1.6.3.jar
c:\full\path\to\asm-5.0.4.jar
c:\full\path\to\commons-codec-1.11.jar
c:\full\path\to\commons-lang3-3.5.jar
c:\full\path\to\gson-2.8.0.jar
c:\full\path\to\javax.mail-1.6.1.jar
c:\full\path\to\javax.servlet-api-4.0.1.jar
c:\full\path\to\jcip-annotations-1.0-1.jar
c:\full\path\to\json-smart-2.3.jar
c:\full\path\to\lang-tag-1.5.jar
c:\full\path\to\nimbus-jose-jwt-9.0.1.jar
c:\full\path\to\oauth2-oidc-sdk-5.64.4.jar
c:\full\path\to\slf4j-api-1.7.21.jar
c:\full\path\to\<SQL JDBC driver>.jre<relevant number for the java version you use>.jar
<before>
标签将确保库被添加到 Matlab 中静态 Java 路径的前面。
- 将
c:\full\path\to\
替换为 Matlab 可以找到 JDBC 驱动程序和 ADAL4J 库的目录。
- 对于 JDBC 驱动程序,select 对应于您的 Matlab 使用的 Java 版本的 .jar 文件。
- 保存
javaclasspath.txt
并重新启动 Matlab。使用命令window中的命令javaclasspath
验证库是否添加到静态Java路径
- 对于每个 Matlab 版本,每个用户都需要重复步骤 1-3。但是也可以只设置一次。除了在用户的偏好目录中使用
javaclasspath.txt
,您还可以在 Matlab 安装的 toolbox\local 目录中更新 classpath.txt
。如果您选择更新 classpath.txt
,只需将这些行添加到文件的顶部,不要使用 <before>
关键字。
- 每个 Matlab 会话,即每次启动 Matlab 时(是的,真的,每次),在连接到数据库之前,执行以下命令:
java.lang.System.clearProperty('javax.xml.transform.TransformerFactory')
这会将 java.xml.transform.TransformerFactory 恢复为默认的 Java 设置。 MATLAB 通常会覆盖此设置,这将使 third-party Java 类 与较旧的 Saxon Transformer 一起工作,但这与 ADAL4J 不兼容。因此,我们将其重置为默认值,以便 ADAL4J 可以再次使用默认的 Java XML Transformer。这必须在每个 MATLAB 会话中完成一次。
- 最后,您可以使用以下命令连接到您的数据库:
conn = database('myDatabase','user@domain.com','myPassword',...
'com.microsoft.sqlserver.jdbc.SQLServerDriver',...
['jdbc:sqlserver://myServer.database.windows.net:1433;' ...
'encrypt=true;trustServerCertificate=false;' ...
'hostNameInCertificate=*.database.windows.net;' ...
'loginTimeout=30;authentication=ActiveDirectoryPassword;database='])
您需要在哪里设置实际的数据库名称、用户名、密码和服务器地址。
就是这样,您现在应该可以连接到您的数据库了!
使用 Matlab 及其数据库工具箱,我需要连接到使用 Microsoft SQL 的 Azure 服务器,使用 Azure ActiveDirectoryPassword
身份验证模式。但是,本机不支持 Azure 活动目录连接,需要一些额外的步骤。 Matlab 使用 Java,因此我需要通过 Java 驱动程序和库来建立与我的数据库的连接。在我尝试解决此问题的最新迭代中,我遇到了以下连接错误:JDBC Driver Error: Failed to load ADAL4J Java library for performing ActiveDirectoryPassword authentication.
通过这个有点相关的问题:https://forum.knime.com/t/connect-to-azure-database/20585, I was referred to the Microsoft page on how to setup the connection: https://docs.microsoft.com/en-us/sql/connect/jdbc/connecting-using-azure-active-directory-authentication?view=sql-server-ver15。此页面上的说明告诉我 On the client machine (on which, you want to run the example), download the azure-activedirectory-library-for-java library and its dependencies, and include them in the Java build path
.
随后,Microsoft 网页将我转到 Github 页面,以安装 ADAL 库。
现在,混乱仍在继续,因为我对下一步该做什么一无所知。我不知道任何 Java,我什至没有直接使用 Java,因为一切都是通过在后台使用 Java 的 Matlab 功能运行的(我唯一做的就是使用连接URL 设置与数据库的连接)。 ADAL/MSAL Github 上的帮助文件对于像我这样的新手来说不是很清楚,而且似乎并不专注于帮助简单的 Windows 用户设置所有库。所以我正在寻求帮助以获得一切 运行.
目前运行是什么?
- 操作系统:Windows 10 64 位服务器基础架构
- Java: 在有问题的电脑上安装 AdoptOpenJDK Java,版本
jdk-8.0.265.01-hotspot
- Matlab:我需要两个设置才能开始工作,Matlab 2017a 和 Matlab 2020a。 Matlab 2017a 最多只支持 Java 7,而 Matlab 2020a 最多支持 Java 8。Java 的(某些部分)似乎也随 Matlab 一起提供。在 Matlab 中使用
version -java
命令,我获得了以下信息:- Matlab 2017a:
Java 1.7.0_60-b19 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
- Matlab 2020a:
Java 1.8.0_202-b08 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
- Matlab 2017a:
- JDBC-驱动程序:通过 Microsoft JDBC 我下载了两个版本的 JDBC 驱动程序:
Microsoft JDBC DRIVER 6.4 for SQL Server
和Microsoft JDBC DRIVER 8.4 for SQL Server
。 Matlab 2017a 将使用驱动程序 6.4(因为它使用 Java 7)而 Matlab 2020a 将使用驱动程序 8.4.
我的问题:
我尝试了什么:
- 我 downloaded the .jar file for MSAL and included it in the
javaclasspath
of Matlab,希望这将包括 Matlab-Java 中的 MSAL 库。不幸的是,这不起作用。 - 我查看了 ADAL github,试图弄清楚如何将其集成到 Java 中。但是我不明白如何做到这一点。
任何帮助将不胜感激,谢谢!
在向 MathWorks 进一步询问后,我能够解决我的问题。主要问题是我缺少 ADAL 库及其所有依赖项。安装它们之后,我能够连接到数据库。最后,这是让一切正常运行的设置。
- Java: 起初我们安装了 AdoptOpenJDK Java,但那是一个错误,没有必要
- 我做了什么:我回滚到原生 Matlab Java。我删除了环境变量中对新 Java 的所有引用,这样 Matlab 只能使用它附带的默认 Java。
- JDBC 驱动程序:是否必须使用 JDBC 驱动程序,或者您是否也可以使用 ODBC 连接?我不完全知道这个问题的答案。在 Matlab 中,似乎如果您想通过脚本以编程方式连接到数据库,您 need/want 可以使用 JDBC 驱动程序。虽然 MathWorks 支持人员没有明确说明,但他们也不建议使用 ODBC
- 我做了什么:使用最新的 JDBC 驱动程序,它仍然支持默认的 Java 版本的 Matlab,
Microsoft JDBC DRIVER 6.4 for SQL Server
for Matlab 2017a(它仍然使用 Java 7 ) 和Microsoft JDBC DRIVER 8.4 for SQL Server
用于 Matlab 2020a(它使用 Java 8)
- 我做了什么:使用最新的 JDBC 驱动程序,它仍然支持默认的 Java 版本的 Matlab,
- ADAL 库:Matlab 需要 ADAL4J 库及其所有依赖项。由此我得出结论,使用 MSAL4J 是不可能的。我直接从 MathWork 获得了必要的库,所以我不知道如何获得它们。我使用的库是:
accessors-smart-1.2.jar
activation-1.1.jar
adal4j-1.6.3.jar
asm-5.0.4.jar
commons-codec-1.11.jar
commons-lang3-3.5.jar
gson-2.8.0.jar
javax.mail-1.6.1.jar
javax.servlet-api-4.0.1.jar
jcip-annotations-1.0-1.jar
json-smart-2.3.jar
lang-tag-1.5.jar
nimbus-jose-jwt-9.0.1.jar
oauth2-oidc-sdk-5.64.4.jar
slf4j-api-1.7.21.jar
答案的 Java/driver 相关部分到此结束。要在 Matlab 中设置所有内容,必须执行以下步骤。
- Matlab 需要知道 JDBC 驱动程序的安装位置以及 ADAL4J 库的位置
- 每个 Matlab 会话,您需要覆盖 Matlab 设置以避免 Matlab 强制 third-party Java 类 使用较旧的 Saxon Transformer。这个较旧的 Saxon Transformer 与 ADAL4J 不兼容。
解决方案:
- 在 Matlab 中执行命令
edit(fullfile(prefdir,'javaclasspath.txt'))
。如果该文件尚不存在,系统将提示您创建该文件。在这种情况下允许 Matlab 创建文件。 - 在 .txt 文件中,输入以下行:
<before> c:\full\path\to\accessors-smart-1.2.jar c:\full\path\to\activation-1.1.jar c:\full\path\to\adal4j-1.6.3.jar c:\full\path\to\asm-5.0.4.jar c:\full\path\to\commons-codec-1.11.jar c:\full\path\to\commons-lang3-3.5.jar c:\full\path\to\gson-2.8.0.jar c:\full\path\to\javax.mail-1.6.1.jar c:\full\path\to\javax.servlet-api-4.0.1.jar c:\full\path\to\jcip-annotations-1.0-1.jar c:\full\path\to\json-smart-2.3.jar c:\full\path\to\lang-tag-1.5.jar c:\full\path\to\nimbus-jose-jwt-9.0.1.jar c:\full\path\to\oauth2-oidc-sdk-5.64.4.jar c:\full\path\to\slf4j-api-1.7.21.jar c:\full\path\to\<SQL JDBC driver>.jre<relevant number for the java version you use>.jar
<before>
标签将确保库被添加到 Matlab 中静态 Java 路径的前面。- 将
c:\full\path\to\
替换为 Matlab 可以找到 JDBC 驱动程序和 ADAL4J 库的目录。 - 对于 JDBC 驱动程序,select 对应于您的 Matlab 使用的 Java 版本的 .jar 文件。
- 保存
javaclasspath.txt
并重新启动 Matlab。使用命令window中的命令javaclasspath
验证库是否添加到静态Java路径 - 对于每个 Matlab 版本,每个用户都需要重复步骤 1-3。但是也可以只设置一次。除了在用户的偏好目录中使用
javaclasspath.txt
,您还可以在 Matlab 安装的 toolbox\local 目录中更新classpath.txt
。如果您选择更新classpath.txt
,只需将这些行添加到文件的顶部,不要使用<before>
关键字。 - 每个 Matlab 会话,即每次启动 Matlab 时(是的,真的,每次),在连接到数据库之前,执行以下命令:
这会将 java.xml.transform.TransformerFactory 恢复为默认的 Java 设置。 MATLAB 通常会覆盖此设置,这将使 third-party Java 类 与较旧的 Saxon Transformer 一起工作,但这与 ADAL4J 不兼容。因此,我们将其重置为默认值,以便 ADAL4J 可以再次使用默认的 Java XML Transformer。这必须在每个 MATLAB 会话中完成一次。java.lang.System.clearProperty('javax.xml.transform.TransformerFactory')
- 最后,您可以使用以下命令连接到您的数据库:
您需要在哪里设置实际的数据库名称、用户名、密码和服务器地址。conn = database('myDatabase','user@domain.com','myPassword',... 'com.microsoft.sqlserver.jdbc.SQLServerDriver',... ['jdbc:sqlserver://myServer.database.windows.net:1433;' ... 'encrypt=true;trustServerCertificate=false;' ... 'hostNameInCertificate=*.database.windows.net;' ... 'loginTimeout=30;authentication=ActiveDirectoryPassword;database='])
就是这样,您现在应该可以连接到您的数据库了!