sqljdbc_auth.dll 已在另一个类加载器中加载

Posted

技术标签:

【中文标题】sqljdbc_auth.dll 已在另一个类加载器中加载【英文标题】:sqljdbc_auth.dll already loaded in another classloader 【发布时间】:2015-05-28 10:33:18 【问题描述】:

我有一个带有不同插件的 RCP 应用程序。在我的两个插件中,我需要使用 Windows 集成身份验证连接到 SQL Server 数据库。加载的第一个插件工作正常,但第二个插件抛出异常:

Native Library sqljdbc_auth.dll already loaded in another classloader

我的代码是

插件 A -> SqlRead.java

static
    try 
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Class.forName("net.sourceforge.jtds.jdbc.Driver");
     catch (ClassNotFoundException e) 
      e.PrintStakeTrace();
    


private Connection openConnection(String connectionString) throws SQLException
    return DriverManager.getConnection(connectionString);
  

插件 B -> Mirror.java

static 
    try 
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Class.forName("net.sourceforge.jtds.jdbc.Driver");
     catch (ClassNotFoundException e) 
        e.printStackTrace();
    
    init();


public void run()
    try 
                this.source=DriverManager.getConnection(EaDbStringParser.eaDbStringToJdbc(this.sourceString));
                this.source.setReadOnly(true);              
             catch (Exception e) 
                if (logView != null)
                    logView.log(new Status(Status.INFO, symbolicName, "cannot establish connection", e));
            

在这两个插件中,我都在类路径下的清单文件中加载了 sqljdbc4.jar 以及 dll

清单如下:

  Bundle-ClassPath: .,
  external:$sqljdbc_driver_location$/sqljdbc4.jar
  Bundle-NativeCode: external:$sqljdbc_driver_location$/auth/x86/sqljdbc_auth.dll 

在插件 A 中它工作正常,但在插件 B 中我得到以下异常

   com.microsoft.sqlserver.jdbc.SQLServerException: This driver is not configured for integrated authentication. ClientConnectionId:f4ad6643-4d5e-4cfd-9f9f-585af3707186
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1667)
at com.microsoft.sqlserver.jdbc.AuthenticationJNI.<init>(AuthenticationJNI.java:60)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:2229)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:41)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:2220)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1326)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:991)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:827)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at com.intel.imc.swa.jetdb.mirror.Mirror.run(Mirror.java:163)
at com.intel.imc.swa.featuremodel.swamodel.mirror.MirrorFeatureModel.run(MirrorFeatureModel.java:59)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
Caused by: java.lang.UnsatisfiedLinkError: Native Library C:\sqljdbc_4.0\enu\auth\x86\sqljdbc_auth.dll already loaded in another classloader
at java.lang.ClassLoader.loadLibrary1(Unknown Source)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at com.microsoft.sqlserver.jdbc.AuthenticationJNI.<clinit>(AuthenticationJNI.java:35)
... 14 more

编辑

在我的 Eclipse 安装下,我有

C:/users/uiqbal/Desktop/Eclispe/sqljdbc_auth.dll 

dll 存在于这个位置,也存在于

C:/sqldriver/enu/auth/x86/sqljdbc_auth.dll

如果我从我的 Eclipse 安装中删除 dll,那么我第一次尝试建立连接时会失败,并抱怨在 java 类路径下找不到 dll。

我创建了一个新插件并在清单中添加了

 Bundle-NativeCode: external:$sqljdbc_driver_location$/auth/x86/sqljdbc_auth.dll

在哪里

  $sqljdbc_driver_location = C:/sqldriver/enu

当我尝试使用再次建立连接时

 DriverManager.getConnection(EaDbStringParser.eaDbStringToJdbc(this.sourceString));

我收到以下错误

 WARNING: Failed to load the sqljdbc_auth.dll cause : Native Library C:\Users\uiqbal\Desktop\FM_Eclipse\sqljdbc_auth.dll already loaded in another classloader

知道如何解决这个问题吗?

【问题讨论】:

相关:***.com/questions/1030792/… 与webapp相关的我正在寻找RCP应用解决方案 我知道,这就是为什么我没有投票为重复,但问题是相似的,其中一个答案提供了一些背景信息。 【参考方案1】:

无论是否作为 OSGi/RCP 运行,VM 都只能加载一次 DLL。

您需要将 DLL 和 sqljdbc4.jar 的加载分开到第三个插件 C 中,然后让 A 和 B 都依赖它。

【讨论】:

你的意思是我应该创建一个插件项目C,我将jar和dll放入其中,并将项目C添加到项目A和B的依赖项中。? 我不希望 jar 和 dll 成为我产品的一部分。我希望它们在我的本地文件系统上 您仍然可以让插件 C 从本地文件系统加载它们。主要的是只有一个 ClassLoader 尝试加载 DLL。 所以插件 C 将只是一个仅加载 jar 和 dll 的强盗插件,插件 A 和 B 应该依赖于插件 C 对吧? 让我试一试,我会回复你的

以上是关于sqljdbc_auth.dll 已在另一个类加载器中加载的主要内容,如果未能解决你的问题,请参考以下文章

sqljdbc_auth.dll 已经加载到 Mule 独立服务器的另一个类加载器中

JBoss:Native Library sqljdbc_auth.dll已经加载到另一个类加载器中

libGDX / roboVM:如何修复“已在另一个类加载器中加载的本机库libhfscompressor.dylib”?

修改 glibc 动态链接器以检查共享库是不是已在另一个进程中加载

win10其中的文件夹或已在另一程序打开

操作无法完成因为其中的文件夹或文件已在另一个程序中打开怎么解决