0

我正在编写将使用 web start 启动的 java 桌面应用程序。应用程序使用 Windows 身份验证连接到 MS SQL Server。我的问题是,要做到这一点,我的程序需要 sqljdbc_auth.dll。在我的电脑上,我可以像这样设置 java.library.path 并且它工作得很好

-Djava.library.path="<MyPath>\Microsoft JDBC Driver 4.0 for SQL Server\sqljdbc_4.0\enu\auth\x86"

也可以正常加载像这样的库

System.loadLibrary("sqljdbc_auth"); 

但是当我尝试通过 Web 启动加载此 DLL 时出现问题。我将 dll 添加到我的项目(/dll/sqljdbc_auth.dll)并将其保存在客户端计算机中,如下所示:

static {
    try {
        System.loadLibrary(SQL_AUTHENTICATION_DLL);
    } catch (UnsatisfiedLinkError exception) {
        loadLib();
    }
}

/**
 * Puts library to temp dir and loads to memory.
 */
private static void loadLib() {
    String name = SQL_AUTHENTICATION_DLL + ".dll";
    try {
        java.io.InputStream isInputStream = SQLServer.class.getResourceAsStream("/dll/" + name);
        java.io.File fileOut = new java.io.File(System.getProperty("java.io.tmpdir") + name);
        java.io.OutputStream osOutputSteream = org.apache.commons.io.FileUtils.openOutputStream(fileOut);
        org.apache.commons.io.IOUtils.copy(isInputStream, osOutputSteream);
        isInputStream.close();
        osOutputSteream.close();
        System.load(fileOut.toString());
    } catch (UnsatisfiedLinkError | java.io.IOException exception) {
        java.util.logging.Logger.getLogger(
                java.util.logging.Logger.GLOBAL_LOGGER_NAME).log(
                java.util.logging.Level.SEVERE,
                "Failed to load " + name , exception);
    }
}

代码正确执行,但未加载 DLL。我收到这样的警告

paź 30, 2013 10:04:45 AM com.microsoft.sqlserver.jdbc.AuthenticationJNI <clinit>
WARNING: Failed to load the sqljdbc_auth.dll cause : no sqljdbc_auth in java.library.path

然后异常

com.microsoft.sqlserver.jdbc.SQLServerException: This driver is not configured for integrated authentication.

我究竟做错了什么?我还应该怎么做才能正确加载它?


这是我的 jnlp 文件。我检查了您要我检查的内容,一切似乎都正常,但仍然无法正常工作。我必须在某处提取dll吗?如果是,具体在哪里?文件 sqljdbc_auth.jar 与主文件 Compliance_Mirror.jar 位于同一目录中。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jnlp codebase="http://spplapp03252:8080/prog/ " href="launch.jnlp" spec="1.0+">
<information>
    <title>Compliance Mirror</title>
    <vendor>B0635410</vendor>
    <homepage href=""/>
    <description>Compliance Mirror</description>
    <description kind="short">Compliance Mirror</description>
</information>
<update check="always"/>
<security>
<all-permissions/>
</security>
<resources>
    <j2se version="1.7+"/>
    <jar href="Compliance_Mirror.jar" main="true"/>
    <nativelib href="sqljdbc_auth.jar"/>
    <jar href="lib/poi-ooxml-schemas-3.9-20121203.jar"/>
    <jar href="lib/poi-3.9-20121203.jar"/>
    <jar href="lib/poi-ooxml-3.9-20121203.jar"/>
    <jar href="lib/dom4j-1.6.1.jar"/>
    <jar href="lib/stax-api-1.0.1.jar"/>
    <jar href="lib/xmlbeans-2.3.0.jar"/>
    <jar href="lib/commons-codec-1.5.jar"/>
    <jar href="lib/commons-logging-1.1.jar"/>
    <jar href="lib/junit-3.8.1.jar"/>
    <jar href="lib/log4j-1.2.13.jar"/>
    <jar href="lib/jxl.jar"/>
    <jar href="lib/commons-io-2.4.jar"/>
    <extension href="jnlpcomponent2.jnlp"/>
    <extension href="jnlpcomponent1.jnlp"/>
</resources>
<application-desc main-class="compliance.mirror.MainClass">
</application-desc>
</jnlp>
4

1 回答 1

2

您正在将 dll 复制到显然不在 java 的库路径上的 tempdir。

使用 webstart 时,添加 dll 的最佳方法是将其打包到一个额外的 jar 中,并将其作为 a 添加nativelib到您的 jnlp 文件中:

<jnlp>
   ...
   <resources>
      ...
      <nativelib href="mydlljar.jar" />
      ...
   </resources>
   ...
</jnlp>

然后System.loadLibrary()应该可以正常工作。

于 2013-10-30T10:19:23.047 回答