Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Apache Windows服务守护进程(ProRun prunsrv)使用java库路径,以便Microsoft SQL集成安全身份验证能够工作_Java_Service_Jvm Arguments_Integrated Security_Procrun - Fatal编程技术网

如何让Apache Windows服务守护进程(ProRun prunsrv)使用java库路径,以便Microsoft SQL集成安全身份验证能够工作

如何让Apache Windows服务守护进程(ProRun prunsrv)使用java库路径,以便Microsoft SQL集成安全身份验证能够工作,java,service,jvm-arguments,integrated-security,procrun,Java,Service,Jvm Arguments,Integrated Security,Procrun,我有一个Java应用程序需要作为Windows服务运行。应用程序需要使用集成安全性连接到Microsoft SQL server。这意味着Java需要在Java库路径中具有驱动程序dll的位置 根据,可以使用以下参数传入JVM选项: ++JvmOptions="-Djava.library.path=drivers/MS SQL/x64" 上面的路径是针对我的案例的 当从命令行使用java.exe运行应用程序,并传入与上述相同的库路径(使用适当的java语法)时,它的工作方式与预期完全相同。但

我有一个Java应用程序需要作为Windows服务运行。应用程序需要使用集成安全性连接到Microsoft SQL server。这意味着Java需要在Java库路径中具有驱动程序dll的位置

根据,可以使用以下参数传入JVM选项:

++JvmOptions="-Djava.library.path=drivers/MS SQL/x64"
上面的路径是针对我的案例的

当从命令行使用java.exe运行应用程序,并传入与上述相同的库路径(使用适当的java语法)时,它的工作方式与预期完全相同。但是,当将应用程序作为服务运行时(在prunsrv中使用jvm模式),它会出现以下异常,并且不会连接:

com.microsoft.sqlserver.jdbc.SQLServerException: 
This driver is not configured for integrated authentication. com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1667)
...
Caused by: java.lang.UnsatisfiedLinkError: no sqljdbc_auth in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
...
该异常与控制台应用程序中省略“-Djava.library.path=drivers/MS SQL/x64”选项时相同。服务似乎没有按预期设置库路径

在查看文档后,有一个看起来很有希望的选项:

--LibraryPath : Directory added to the search path used to locate the DLLs for the JVM. This directory is added both in front of the PATH environment variable and as a parameter to the SetDLLDirectory function.
这正是我想要的


遗憾的是,当将此选项与java.library.path jvm选项一起设置时,它仍然抛出与以前完全相同的异常。好像它没有应用这个设置。

我发布这个答案是因为我发现很难找到关于这个特定用例的文档。我希望这篇文章能节省一些时间

事实证明,jvm模式的解决方案是使用--LibraryPath选项,但您不能在++JVMPoptions=“…”中包含相同的库路径,因为这样它似乎会破坏它,并且您会得到异常

总之

  • 在++JVMPoptions参数中保留您通常需要的任何jvm选项
  • 从++JVM选项参数中删除所有java.library.path配置NB
  • 添加另一个--LibraryPath参数,并在步骤1中删除路径
  • 例如:

    ++JvmOptions="-Dfile.encoding=UTF8;-Xmx6g" --LibraryPath="%solutionRootPath%\bin\drivers\MS SQL\x64"
    
    其中,上面的路径和环境变量特定于我的用例

    执行此操作后,解决方案的工作原理与使用java.exe从命令行运行时相同