Получение NoClassDefFoundError (сгенерированного Eclipse jar) с использованием Apache procrun, но отлично работает в командной строке
Я экспортировал свое приложение как один большой пакет из Eclipse, поэтому оно использует загрузчик Eclipse. Я установил его с помощью procrun, используя файл install.bat, наиболее важные строки показаны ниже:
set PR_CLASSPATH=C:\somepath\ECGIServer.jar
set PR_LIBRARYPATH=C:\somepath\native\lunaLibrary.dll
set PR_STARTMODE=jvm
set PR_STOPMODE=jvm
Очевидно, что есть гораздо больше, и сервис действительно работает. В файле ECGIServer.jar находится файл Manifest:
Manifest-Version: 1.0
Rsrc-Class-Path: ./ commons-codec-1.6.jar stax-api-1.0-2.jar LunaProvider.jar
Class-Path: .
Rsrc-Main-Class: ecgi.encrypter.ECgiServer
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
Есть еще баночки для списка, но слишком много, чтобы написать. В любом случае, когда я запускаю его (ECGIServer.jar) в командной строке, он прекрасно работает. Когда я запускаю его как сервис, он работает до тех пор, пока я не попытаюсь создать экземпляр LunaProvider. Как только приложение создает экземпляр LunaProvider, я получаю:
java.lang.NoClassDefFoundError: com/safenetinc/luna/provider/LunaProvider
Как видите, LunaProvider - это библиотека ThridParty, которая только что была загружена из моей настройки Eclipse.
2 ответа
То, как я понял это, чтобы заставить его работать, генерировало jar и папку библиотеки отдельно. Это создает файл.jar и каталог с именем YourAppName_lib. Так что в.bat вы должны установить PR_LIBRARYPATH в папку _lib, и на этом все.
Ну, наконец, решил попробовать экспортировать зависимые каталоги из Eclipse в отдельный каталог. После того, как я сделал это, все мои зависимости, включая LunaProvider.jar, были сброшены в этот каталог. Я изменил следующую строку в файле install.bat на:
set PR_CLASSPATH=C:\somepath\ECGIServer.jar;C:\somepath\ECGIServer_lib
И все получилось просто отлично. До сих пор не могу понять, почему.