2

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

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

++JvmOptions="-Djava.library.path=drivers/MS SQL/x64"

上面的路径特定于我的情况。

当从命令行使用 java.exe 运行应用程序并传入与上面相同的库路径(使用适当的 java 语法)时,它完全按预期工作。但是,当将应用程序作为服务运行时(在 prusrv 中使用 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”选项时的情况相同。该服务似乎没有按预期设置库路径。

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

--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 选项一起设置时,它仍然会引发与以前完全相同的异常。就好像它没有应用设置一样。

4

1 回答 1

2

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

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

总之...

  1. 在 ++JvmOptions 参数中保留您通常需要的任何 jvm 选项。
  2. 从 ++JvmOptions 参数中删除所有 java.library.path 配置。注意!
  3. 添加另一个 --LibraryPath 参数,其中包含在步骤 1 中删除的路径。

如:

++JvmOptions="-Dfile.encoding=UTF8;-Xmx6g" --LibraryPath="%solutionRootPath%\bin\drivers\MS SQL\x64"

上面的路径和环境变量特定于我的用例。

完成此操作后,该解决方案的工作方式与使用 java.exe 从命令行运行一样。

于 2015-03-09T12:17:25.353 回答