Ошибка Tess4J после распространения как войны NoClassDefFoundError: Не удалось инициализировать класс net.sourceforge.tess4j.TessAPI
У меня есть проект Spring boot Webserver, который нормально работает на моем ПК под Intellij IDEA, но не работает после распространения на тот же ПК, что и файл war - NoClassDefFoundError: Не удалось инициализировать класс net.sourceforge.tess4j.TessAPI.
мой код:
ITesseract instance = new Tesseract(); // JNA Interface Mapping
instance.setDatapath(new File(datapath).getPath());
instance.setLanguage("eng");
try {
String result = instance.doOCR(imageFile);
} catch (TesseractException e) {
System.err.println(e.getMessage());
}
У меня есть только одна maven-зависимость, выпущенная для Tess4J:
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.0.0</version>
</dependency>
У меня ошибка после запуска моей распределенной войны:
There was an unexpected error (type=Internal Server Error, status=500).
Could not initialize class net.sourceforge.tess4j.TessAPI
Полный журнал Tomcat:
java.lang.NoClassDefFoundError: Could not initialize class net.sourceforge.tess4j.TessAPI
at net.sourceforge.tess4j.Tesseract.init(Tesseract.java:367) ~[tess4j-3.0.0.jar:3.0.0]
at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:280) ~[tess4j-3.0.0.jar:3.0.0]
at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:212) ~[tess4j-3.0.0.jar:3.0.0]
at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:196) ~[tess4j-3.0.0.jar:3.0.0]
at ocr.OCRController.handleFileUpload(OCRController.java:127) ~[classes/:0.3.0]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_51]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_51]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_51]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_51]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
Как я могу исправить ошибку? У меня есть план для размещения этого приложения в Windows Azure под Tomcat. Спасибо за любую помощь, друзья!
2 ответа
Проблема была в папке temp - она не содержит всех необходимых библиотек.
Информация для сообщества:
1. Проверьте временную папку под tomact - для меня путь к ней:D:\Programs_Files\apache-tomcat-8.0.27\temp
Эта временная папка ДОЛЖНА содержать каталог tess4j\win32-x86-64 со следующими 3 файлами: gsdll64.dll, liblept171.dll, libtesseract304.dll (или ваша версия)
У меня была проблема, потому что каталог tess4j\win32-x86-64 никогда не создавался в temp.
НО
Мое приложение работает нормально под Intellij IDEA, потому что другая папка Temp (для IDEA) работает нормально - C:\Users\Iuliia\AppData\Local\Temp\
содержит tess4j\win32-x86-64\gsdll64.dll, tess4j\win32-x86-64\liblept171.dll, tess4j\win32-x86-64\libtesseract304.dll, как и ожидалось.
Обратите внимание, что эти файлы создаются в процессе вызова Tesseract в вашем коде. Не рано
КАК ИСПРАВИТЬ ПРОБЛЕМУ с темпом под Tomcat
Я добавил win32-x86-64\gsdll64.dll, win32-x86-64\liblept171.dll, win32-x86-64\libtesseract304.dll в каталог ресурсов в моем проекте.
Посмотрите на структуру моего проекта:
После развертывания в tomcat необходимые dll находятся в каталоге классов (важно!) - это означает, что они находятся в области видимости.
Теперь он будет добавлен в
D:\Programs_Files\apache-tomcat-8.0.27\temp\tess4j\win32-x86-64, как и ожидалось.
Еще одно исправление для NoClassDefFoundError
Например, установка соответствующих Microsoft C++ Runtime
(прокрутите вниз и разверните Other Tools and Frameworks
):
Поскольку библиотеки DLL создаются с использованием Visual Studio 2015/2017, убедитесь, что у вас установлен распространяемый Visual C++ 2015 или распространяемый VC++ 2017.
Обратитесь к руководству по разработке Tess4J для более подробной информации.
Я обновился до Windows 10, и внезапно tessarct больше не работал с моим приложением.
В соответствии с Tess4J документы, вы должны иметь VC++ 2017 Redistributable установлен.
После того, как я установил его в Windows 10, все снова заработало.
Если вы обновились до Windows 10, и у вас возникла вышеуказанная проблема, и она работала раньше, то, скорее всего, это ваша проблема.