2015-03-09 1 views
1

У меня есть приложение Java, которое должно запускаться как служба Windows. Приложению необходимо подключиться к серверу Microsoft SQL с помощью Integrated Security. Это означает, что Java должно иметь расположение DLL драйвера в пути библиотеки java.Как получить демоны службы Apache Windows (procrun prunsrv), чтобы использовать путь к библиотеке Java, так что может работать SQL Server Integrated Security Authentication

Согласно prunsrv documentation, можно передать параметры виртуальной машины Java, используя следующие параметры:

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

где выше путь специфичен к моему делу.

При запуске приложения с использованием java.exe из командной строки и прохождения в том же пути библиотеки, что и выше (с соответствующим синтаксисом java), он работает точно так, как ожидалось. Однако, при запуске приложения в качестве службы (с использованием Jvm режима в prunsrv) дает следующее исключение и не связывает:

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 = водителей/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 она по-прежнему выбрасывает то же самое исключение, что и раньше. Это похоже на то, что он не применил настройку.

ответ

1

Я отправляю этот ответ, потому что мне очень трудно найти документацию по этому конкретному случаю использования. Надеюсь, этот пост спасет кого-нибудь.

Оказывается, что решение для режима jvm должно использовать параметр --LibraryPath, но вы НЕ должны включать тот же путь библиотеки в ++ JvmOptions = "...", потому что тогда он, кажется, разбивает его, а вы получить исключение.

В заключение ...

  1. Держите любые варианты JVM обычно нужно в ++ параметр JvmOptions.
  2. REMOVE все конфигурации java.library.path из параметра ++ JvmOptions. NB!
  3. Добавить еще один параметр --LibraryPath с путями, удаленными в шаге 1.

Как и в:

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

, где путь и переменная окружения выше специфична для моего использования.

После этого решение работает так же, как если бы оно запускалось из командной строки с помощью java.exe.