2016-01-06 2 views
1

После 2 дней поиска в Google я до сих пор не могу найти решение проблемы с Tess4j версии 3.0: java .lang.UnsatisfiedLinkError: указанный модуль не найден.Проблема с Tess4j в Windows: java.lang.UnsatisfiedLinkError: указанный модуль не найден в instance.doOCR (imageFile)

Я пишу серверное приложение Spring boot на моем Windows 10 x64. Я использовал этот учебник http://tess4j.sourceforge.net/tutorial/ Я делаю ant test в источнике проекта tess4j, и эта команда работает нормально на моем ПК. У меня также есть Visual C++ Redistributable для VS2012 и Visual C++ Redistributable для VS2013. Но я пропустил в моем DLLs ПК, libtesseract304.dll зависит от:

Может ли это быть причиной проблемы? Но как это возможно, что проект Tess4J-3.0-src работает нормально на моем ПК?

Мой полный стек след:

java.lang.UnsatisfiedLinkError: The specified module could not be found. 

    at com.sun.jna.Native.open(Native Method) ~[jna.jar:4.2.1 (b0)] 
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:263) ~[jna.jar:4.2.1 (b0)] 
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:403) ~[jna.jar:4.2.1 (b0)] 
    at com.sun.jna.Library$Handler.<init>(Library.java:147) ~[jna.jar:4.2.1 (b0)] 
    at com.sun.jna.Native.loadLibrary(Native.java:502) ~[jna.jar:4.2.1 (b0)] 
    at com.sun.jna.Native.loadLibrary(Native.java:481) ~[jna.jar:4.2.1 (b0)] 
    at net.sourceforge.tess4j.util.LoadLibs.getTessAPIInstance(Unknown Source) ~[tess4j-3.0.jar:na] 
    at net.sourceforge.tess4j.TessAPI.<clinit>(Unknown Source) ~[tess4j-3.0.jar:na] 
    at net.sourceforge.tess4j.Tesseract.init(Unknown Source) ~[tess4j-3.0.jar:na] 
    at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source) ~[tess4j-3.0.jar:na] 
    at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source) ~[tess4j-3.0.jar:na] 
    at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source) ~[tess4j-3.0.jar:na] 
    at ocr.OCRController.handleFileUpload(OCRController.java:109) ~[classes/:na] 
    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] 

Мой код:

ITesseract instance = new Tesseract(); // JNA Interface Mapping 

instance.setDatapath(new File(datapath).getPath()); 
instance.setLanguage("eng");  
try { 
    String result = instance.doOCR(imageFile); //error here 
} catch (TesseractException e) { 
    System.err.println(e.getMessage()); 
} 

Maven:

<dependency> 
    <groupId>jai_imageio</groupId> 
    <artifactId>com.jai_imageio</artifactId> 
    <version>3.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/lib/jai_imageio.jar</systemPath> 
</dependency> 
<dependency> 
    <groupId>commons-io-2.4</groupId> 
    <artifactId>com.commons-io-2.4</artifactId> 
    <version>3.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/lib/commons-io-2.4.jar</systemPath> 
</dependency> 
<dependency> 
    <groupId>jna</groupId> 
    <artifactId>com.jna</artifactId> 
    <version>3.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/lib/jna.jar</systemPath> 
</dependency> 
<dependency> 
    <groupId>tess4j-3.0</groupId> 
    <artifactId>com.tess4j-3.0</artifactId> 
    <version>3.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/lib/tess4j-3.0.jar</systemPath> 
</dependency> 

Я также пытался загрузить LIBS в силовом образом:

Runtime.getRuntime().loadLibrary("lib/win32-x86-64/gsdll64"); 
Runtime.getRuntime().loadLibrary("lib/win32-x86-64/libtesseract304"); 

Но без успеха:

There was an unexpected error (type=Internal Server Error, status=500). 
C:\Users\Iuliia\IdeaProjects\ENumbersBackend\lib\win32-x86-64\libtesseract304.dll: Can't find dependent libraries 

Спасибо за любую помощь!

+1

Вам не хватает зависимой библиотеки. Убедитесь, что все зависимые библиотеки находятся в PATH или в том же каталоге, что и библиотека, загружаемая JNA. Вы можете использовать [depend.exe] (http://dependencywalker.com), чтобы определить полный набор зависимостей. – technomage

+0

@ technomage, да, я знаю про пропущенные библиотеки, но как я могу быстро исправить все это, кстати, у меня уже есть распространяемый для Visual C++ дистрибутив для VS2012 и Visual C++ для VS2013. –

+2

Вы можете использовать '-Djna.debug_load', чтобы JNA печатал на консоли все места, где он ищет нашу основную DLL и где она в конечном итоге загружается. – technomage

ответ

0

Проблема не связана с ОС Windows 10.

Я уже исправить ошибку с добавлением

<dependency> 
    <groupId>net.sourceforge.tess4j</groupId> 
    <artifactId>tess4j</artifactId> 
    <version>3.0.0</version> 
</dependency> 

вместо всех предыдущих зависимостей Maven.

2

Я думаю, что вы ввели в заблуждение выводом depend.exe.

DLL, импортирует только эти другие библиотеки DLL:

dumpbin libtesseract304.dll /imports|find ".dll" 
Dump of file libtesseract304.dll 
    WS2_32.dll 
    liblept171.dll 
    MSVCP120.dll 
    MSVCR120.dll 
    KERNEL32.dll 

перепроверить вы можете получить версию компоновщика, используемый для компиляции этой библиотеки:

dumpbin libtesseract304.dll /headers | find "linker version" 
      12.00 linker version 

Так все, что вам нужно, это Visual Studio 2013 Продолжительность (опять же: не вводите в заблуждение: 12,0 - 2013 год, что может быть довольно запутанным)

Предположительно, файл liblept171.dll отсутствует, поэтому вы должны проверить, где он хранится и почему один проект может найти его, а не другой. Хорошая идея - скопировать все зависимости в общий путь и установить java.library.path в этот каталог (только для целей тестирования)

liblept171.dll является частью lept4j, в каталоге lib есть соответственно названный .jar, который содержит, что длл:

7z l lib\lept4j-1.0.1.jar | find ".dll" 
2015-11-14 11:46:04 .....  2406400  2406400 win32-x86-64\liblept171.dll 
2015-11-14 11:46:04 .....  1834496  1834496 win32-x86\liblept171.dll 

Кроме того, вы должны позаботиться о том, разрядность вашей JRE, то время выполнения Visual Studio и Тессеракт сделать матч. Если есть сомнения: установите x86 и x64.

В качестве дополнительной помощи по устранению неполадок вы, возможно, захотите узнать, где находится dll. Используйте procmon.exe с фильтром для этой DLL.

 Смежные вопросы

  • Нет связанных вопросов^_^