我正在编写将使用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 start加载此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>
答案 0 :(得分:2)
您正在将dll复制到tempdir,这显然不在java的库路径上。
使用webstart时,添加dll的最佳方法是将其打包到一个额外的jar中,并将其作为nativelib
添加到您的jnlp文件中:
<jnlp>
...
<resources>
...
<nativelib href="mydlljar.jar" />
...
</resources>
...
</jnlp>
然后System.loadLibrary()
应该没有问题。