Нативная библиотека в Tomcat UnsatisfiedLinkError + Windows + eclipse

Этот вопрос мог быть задан ранее на SO, и будьте уверены, что я проверил все доступные решения. Все еще не мог заставить его работать

Моя проблема точно такая же, как описана в этом посте /а>

Автономное Java-приложение работает отлично. Однако с Tomcat(9) он не запускается и выдает

java.lang.UnsatisfiedLinkError: third_party.org.chokkan.crfsuite.crfsuiteJNI.swig_module_init()V
    at third_party.org.chokkan.crfsuite.crfsuiteJNI.swig_module_init(Native Method)
    at third_party.org.chokkan.crfsuite.crfsuiteJNI.<clinit>(crfsuiteJNI.java:87)
    at third_party.org.chokkan.crfsuite.Tagger.<init>(Tagger.java:39)

Я знаю, что моя DLL загружается, также я проверил, что папка, в которой находится моя DLL, находится в переменной PATH. Я также проверил загружаемые классы и загружаемую DLL.

Я заметил 3 типа UnsatisfiedLinkError в SO

1) java.lang.UnsatisfiedLinkError: Third_Party.org.chokkan.crfsuite.crfsuiteJNI.swig_module_init()V 2) java.lang.UnsatisfiedLinkError: Third_party.org.chokkan.crfsuite.crfsuiteJNI.swig_module_init() B 3) Когда загрузчик классов загружается дважды.

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

Один из принятых ответов в сообщении SO, которым я поделился выше, утверждает, что это как-то связано с версией. Я не понимаю, как это приемлемое решение, поскольку оно отлично работает при запуске в качестве автономного приложения Java.

Уже потрачено много времени, любая помощь заметна.

Спасибо, Чахат.


person user4772933    schedule 28.09.2016    source источник
comment
B (Byte) и V (Void) относятся к сигнатуре метода(ов) swing_module_init()V и говорят только о том, что возвращаемый тип Void (или Byte в другом случае), см.: docs.oracle.com/javase/7/docs/technotes/guides/jni/spec /   -  person nyyrikki    schedule 28.09.2016
comment
спасибо nyyrikki за ответ, не могли бы вы сказать мне, как это исправить? заставить вызов собственных функций работать в веб-приложении (tomcat) ?? Спасибо   -  person user4772933    schedule 05.10.2016
comment
Работает ли он у вас, когда он не работает в Tomcat (не только загрузка, но и вызов собственных методов)? Если я правильно понимаю ваше описание выше, вы больше имеете в виду связанную проблему в stackoverflow. Также было бы полезно, если бы вы показали нам заголовочный файл, сгенерированный с помощью javah.   -  person nyyrikki    schedule 05.10.2016
comment
Да, это работает, когда я запускаю его как стандартное приложение Java, но не с Tomcat. Я использую сторонний код в своем приложении. он доступен здесь, на GitHub github.com/vinhkhuc/jcrfsuite Он использует SWIG (я не знаком с SWIG, я просто использую его код как есть, и он работает в автономном приложении) Вот заголовочный файл github.com/vinhkhuc/jcrfsuite/blob/master/src/main/java/ И это место, где Сбой приложения tomcat / Third_Party/org/chokkan/crfsuite/crfsuiteJNI.java (строка номер 85)   -  person user4772933    schedule 05.10.2016


Ответы (2)


Я столкнулся с той же проблемой. Я наконец нахожу решение. Меня устраивает.

Сначала я установил libLBFGS и crfsuite. Инструкцию можно найти здесь (http://www.chokkan.org/software/crfsuite/manual.html). libcrfsuite.so будет установлен в /usr/local/lib

Во-вторых, я редактирую конфигурацию tomcat, чтобы загрузить собственную библиотеку. Я создаю setenv.sh в папке bin tomcat, устанавливаю переменную CATALINA_OPTS с содержимым:

экспорт CATALINA_OPTS="-Djava.library.path=/usr/local/bin:/usr/local/lib"

Наконец, я использовал собственный ServletContextListener и явно загрузил libcrfsuite.so с помощью System.load(). Я перехожу по этой ссылке, чтобы загрузить библиотеку (https://github.com/vinhkhuc/jcrfsuite/tree/master/src/main/resources/crfsuite-0.12)

person user3239931    schedule 15.05.2017

У меня была похожая проблема, но не с Tomcat. В итоге я скопировал логику одного из их классов и просто вызвал:

static {
    try {
        CrfSuiteLoader.load();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
person Ohad Zadok    schedule 26.08.2017