I / O错误:SSO失败:未加载本机SSPI库

我试图运行以下代码:

import java.sql.DriverManager; public class Connect { public static void main(String[] args){ try{ String databaseDriver = "net.sourceforge.jtds.jdbc.Driver"; Class.forName(databaseDriver); } catch (Exception e) { e.printStackTrace(); } try{ String url = "jdbc:jtds:sqlserver://BHX:1433/Forecast;instance=SQLEPXRESS"; java.sql.Connection con = DriverManager.getConnection(url); System.out.println("Connection"); } catch (Exception e){ e.printStackTrace(); } } } 

我的SQL服务器在机器BHX上的端口1433上运行。

我得到的错误消息如下:

 java.sql.SQLException: I/O Error: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property. at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:615) at net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java:352) at net.sourceforge.jtds.jdbc.ConnectionJDBC3.(ConnectionJDBC3.java:50) at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:185) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at Connect.main(Connect.java:14) Caused by: java.io.IOException: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property. at net.sourceforge.jtds.jdbc.TdsCore.sendMSLoginPkt(TdsCore.java:1893) at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:588) ... 6 more 

我已经读过为什么会出现这种情况并在这里找到类似的问题,但这似乎不起作用。 运行代码时,我已经包含以下参数来查找SSO文件:

 -Djava.library.path=/Tester/jdbc/x64/SSO 

这是我的文件的结构

 **Tester** *src* default package Connect.java *JRE System Library* *jdbc* conf html IA64 x64 SSO ntlmauth.dll x86 

你能发现什么问题吗?

看起来像这个问题一样: jtds-driver-not-working-for-sql-sever-2008r2-and-denali-native-sspi-library-not

您应该将相应的ntlmauth.dll文件从JTDS下载包中删除到您的JRE bin文件夹中。

如果您在64位Windows机器上运行:

  • 这个32位DLL:

    下载>>> jtds-1.3.0-dist.zip >>> x86 >>> SSO >>> ntlmauth.dll

  • 在这个32位JRE位置到这里:

    C:\ Program Files(x86)\ Java \ jre7 \ bin

  • 这个64位DLL:

    下载>>> jtds-1.3.0-dist.zip >>> x64 >>> SSO >>> ntlmauth.dll

  • 在64位JRE位置到这里:

    C:\ Program Files \ Java \ jre7 \ bin

如果您在32位Windows机器上运行:

  • 这个32位DLL:

    下载>>> jtds-1.3.0-dist.zip >>> x86 >>> SSO >>> ntlmauth.dll

  • 在这个32位JRE位置到这里:

    C:\ Program Files \ Java \ jre7 \ bin

如果这不起作用,那么尝试在main方法的顶部添加这一行: System.out.println(java.lang.System.getProperty('java.library.path'));

它应该输出程序使用的实际JRE路径。 确保相应的ntlmauth.dll位于该JRE的bin文件夹中。

注意:使用此方法时,请勿设置连接的域,用户或密码属性。

注意:如果您的Java客户端程序在非Windows机器上运行,那么使用ntlmauth.dll方法是不合时宜的。 这是JTDS下载包中随附文档的引用:下载>>> jtds-1.3.0-dist.zip >>> README.SSO

从版本0.9.2开始,jTDS能够使用运行客户端程序的帐户下的当前用户的Windows凭据登录到SQL Server(Windows Single Sign On)。

使用Windows Single Sign On(SSO)客户端将能够在不提供凭据的情况下连接到Microsoft SQL Server。 它将动态读取当前用户的凭据并连接到数据库。 前提是Windows帐户在数据库中具有足够的权限。 这是使用本机(仅限Windows)库ntlmauth.dll完成的。

我有一个类似的问题,我试图将ntlmauth.dll文件放在我认为sql-developer会寻找它的多个目录中。 我终于通过将ntlmauth.dll文件放在sql-developer应用程序目录本身的\jdk\jre\bin文件夹中(即sql-developer\jdk\jre\bin )来实现它。 为什么sql-developer会在这个文件夹中查找ntlmauth.dll,而不是系统文件夹超出我的理解水平。 无论如何,它奏效了。

以下是我刚刚回答的类似问题的链接。

Oracle SQL Developer与Microsoft SQL Server的连接

即使成功将ntmauth.dll文件放在JRE / bin中,我也会遇到同样的错误。

然后我尝试将ntmauth.dll放在C:\Windows\System32目录中。 通过这样做,问题得到解决。

未通过身份validation参数会导致相同的错误,因此,对于其他答案,您也可以在连接字符串中传递用户名和密码,例如

 jdbc:jtds:sqlserver://localhost:1433/dbname;user=username;password=s3cr3t 

做得好。

但是,部署JAR文件时有一点问题!

我建议创建一个文件夹(例如, lib )并复制所有本机库。最后添加一个Java执行参数:

 java -jar your_jar.jar -Djava.library.path=./lib 

这得益于JTDS驱动程序不适用于SQL Server 2008R2和Denali Native SSPI库未加载

我通过将ntlmauth.dll文件放在\jdk\jre\bin 。 我使用Tomcat作为我的应用程序服务器。

但是,我注意到这只适用于一次部署的一个Web应用程序。 如果我对多个Web应用程序具有相同的设置,则所有应用程序都会失败。 这是一个非常奇怪的行为。 知道这里发生了什么吗?

Interesting Posts