2013-10-30 2 views
0

웹 시작을 사용하여 시작할 Java 데스크톱 응용 프로그램을 작성하고 있습니다. 응용 프로그램은 Windows 인증을 사용하여 MS SQL Server에 연결합니다. 내 문제는, 이렇게하려면 내 프로그램에 sqljdbc_auth.dll이 필요하다는 것입니다. 나는이를로드 할 때 내 컴퓨터에서 나는이 같은 java.library.path 설정할 수 있으며Java WebStart dll이로드되지 않습니다.

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

또한로드 라이브러리이 작품의 제대로

System.loadLibrary("sqljdbc_auth"); 

처럼의 벌금을 작동하지만 문제가있다 웹 시작 DLL. 나는 내 프로젝트 (/dll/sqljdbc_auth.dll)에 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을 추출해야합니까? 그렇다면 exacly 어디 있습니까? 파일 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> 

답변

2

dll을 분명히 java의 library-path에없는 tempdir로 복사하고 있습니다.

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

그런 다음 System.loadLibrary() 문제없이 작동합니다 :

DLL을 추가 할 수 Webstart가에게 가장 좋은 방법을 사용하여 별도의 용기로 포장하고 jnlp 파일로 nativelib로 추가하는 것입니다.

+0

빠른 응답 감사합니다. 라이브러리 경로에없는 임시 디렉토리에 복사하고 있지만 라이브러리 경로에있는 모든 디렉토리에이 DLL을 붙여 넣을 수있는 권한이 없습니다. 물론 나는 또한 다른 디렉토리에서 엉망이되고 싶지 않았다. 나는 당신의 방법을 시도하지만 여전히 성공하지 못했습니다. 나는 자바를 처음 사용하고 아마도 뭔가 잘못했을 것이다. 새 빈 프로젝트에 DLL을 추가하고 컴파일 한 다음 jnlp 파일에''을 추가 한 후'System.loadLibrary ("sqljdbc_auth")'를 사용합니다. java.library.path'에 sqljdbc_auth이 없습니다. 무엇이 없습니까? – barczi

+0

좋아하는 zip-tool을 사용하여 sqljdbc_auth.jar을 열고 정말로 sqljdbc_auth.dll이 있는지 확인하십시오. 거기에 있다면 제어판을 통해 java-console을 활성화하고 출력에 오류가 있는지 확인할 수 있습니다. 아무 것도 표시되지 않으면 확인을 위해 jnlp 파일을 게시하십시오. –