设置ADAL / MSAL以使用Matlab连接到Azure数据库

如何解决设置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
  • JDBC驱动程序:通过Microsoft JDBC,我下载了两个版本的JDBC驱动程序:Microsoft JDBC DRIVER 6.4 for SQL ServerMicrosoft JDBC DRIVER 8.4 for SQL Server。 Matlab 2017a将使用驱动程序6.4(因为它使用Java 7),而Matlab 2020a将使用驱动程序8.4。

我的问题:

  1. 我使用ADAL还是MSAL
  2. 如何获取Java中需要的库,以便Matlab可以使用它?

我尝试过的事情:

  • 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)
  • 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中设置所有内容,必须执行以下步骤。

  1. Matlab需要知道JDBC驱动程序的安装位置以及ADAL4J库的位置
  2. 在每个Matlab会话中,您都需要覆盖Matlab设置,以避免Matlab强制第三方Java类使用较旧的Saxon Transformer。此较旧的Saxon变压器与ADAL4J不兼容。

解决方案:

  1. 在Matlab中执行命令edit(fullfile(prefdir,'javaclasspath.txt'))。如果文件尚不存在,将提示您创建文件。在这种情况下,允许Matlab创建文件。
  2. 在.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文件。
  3. 保存javaclasspath.txt并重新启动Matlab。在命令窗口中使用命令javaclasspath来验证是否已将库添加到静态Java路径
  4. 每个Matlab版本中的每个用户都需要重复执行步骤1-3。但是也可以只设置一次。除了在用户的首选项目录中使用javaclasspath.txt之外,您还可以在Matlab安装的toolbox \ local目录中更新classpath.txt。如果您选择更新classpath.txt,只需将这些行添加到文件顶部,而不使用<before>关键字。
  5. 每个Matlab会话,即,每次启动Matlab(是的,实际上是每次),在连接数据库之前,请执行以下命令:
    java.lang.System.clearProperty('javax.xml.transform.TransformerFactory')
    
    这会将java.xml.transform.TransformerFactory还原为其默认Java设置。 MATLAB通常会覆盖此设置,这会使第三方Java类与较旧的Saxon Transformer一起使用,但与ADAL4J不兼容。因此,我们将其重置为默认值,以便ADAL4J可以再次使用默认的Java XML Transformer。每个MATLAB会话必须执行一次。
  6. 最后,您可以使用以下命令连接到数据库:
    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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-