如何解决设置ADAL / MSAL以使用Matlab连接到Azure数据库
我需要使用Matlab及其数据库工具箱,使用Azure ActiveDirectoryPassword
身份验证模式,使用Microsoft SQL连接到Azure服务器。但是,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,我被转到Microsoft页面,介绍如何设置连接: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的PC上安装了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用于MSAL的.jar文件,并将其包含在
javaclasspath
of Matlab中,希望它包括Matlab-Java中的MSAL库。不幸的是,这行不通。 - 我查看了ADAL github,试图弄清楚如何将其集成到Java中。但是我不知道如何做到这一点。
任何帮助将不胜感激,谢谢!
解决方法
在与MathWorks进行进一步查询后,我得以解决我的问题。主要问题是我缺少ADAL库及其所有依赖项。安装它们之后,我能够连接到数据库。最后,这是使一切正常的设置。
- Java:最初,我们安装了AdoptOpenJDK Java,但这是一个错误,并非必要
- 我做了什么:我回滚到了本机Matlab Java。我删除了环境变量中所有对新Java的引用,因此Matlab只能使用它附带的默认Java。
- JDBC驱动程序:严格需要使用JDBC驱动程序,还是可以使用ODBC连接?我不完全知道这个问题的答案。在Matlab中,如果您想通过脚本以编程方式连接到数据库,则需要/想要使用JDBC驱动程序。尽管MathWorks支持人员未明确说明,但他们也不建议使用ODBC。
- 我的工作:使用仍支持默认Java版本的Matlab的最新JDBC驱动程序,对于Matlab 2017a(仍使用Java 7)使用
Microsoft JDBC DRIVER 6.4 for SQL Server
,对于Matlab 2020a(其使用Java)使用Microsoft JDBC DRIVER 8.4 for SQL Server
8)
- 我的工作:使用仍支持默认Java版本的Matlab的最新JDBC驱动程序,对于Matlab 2017a(仍使用Java 7)使用
- 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 /驱动程序相关的部分。要在Matlab中设置所有内容,必须执行以下步骤。
- Matlab需要知道JDBC驱动程序的安装位置以及ADAL4J库的位置
- 在每个Matlab会话中,您都需要覆盖Matlab设置,以避免Matlab强制第三方Java类使用较旧的Saxon Transformer。此较旧的Saxon变压器与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驱动程序,选择与Matlab使用的Java版本相对应的.jar文件。
-
- 保存
javaclasspath.txt
并重新启动Matlab。在命令窗口中使用命令javaclasspath
来验证是否已将库添加到静态Java路径 - 每个Matlab版本中的每个用户都需要重复执行步骤1-3。但是也可以只设置一次。除了在用户的首选项目录中使用
javaclasspath.txt
之外,您还可以在Matlab安装的toolbox \ local目录中更新classpath.txt
。如果您选择更新classpath.txt
,只需将这些行添加到文件顶部,而不使用<before>
关键字。 - 每个Matlab会话,即,每次启动Matlab(是的,实际上是每次),在连接数据库之前,请执行以下命令:
这会将java.xml.transform.TransformerFactory还原为其默认Java设置。 MATLAB通常会覆盖此设置,这会使第三方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='])
就是这样,您现在应该可以连接到数据库了!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。