Как заставить демонов службы Windows Apache (procrun prunsrv) использовать путь к библиотеке Java, чтобы могла работать аутентификация Microsoft SQL Integrated Security

1

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

Согласно документации prunsrv, можно перейти в опции JVM, используя следующий параметр:

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

Теги:
service
jvm-arguments
procrun
integrated-security

1 ответ

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню