Java-программа Tess4j и NetBeans - проблемы "AWT-Eventqueue-0" unsatisfied-link-error
Я запрограммировал небольшой инструмент, который берет изображение и использует tesseract для извлечения данных из него. Я использовал Java в Netbeans на 64-битной машине с Windows 7. Пока что программа прекрасно компилируется и делает то, что я хочу - включая tesseract -. Но когда я пытаюсь очистить и собрать готовый проект в Netbeans и попытаться запустить сгенерированный.jar в.cmd
java -jar "..\Users\Marv\Scantool.jar"
Я получаю следующую ошибку:
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: The module can not be found
at com.sun.jna.Native.open(Native Method)
at com.sun.jna.Native.open(Native.java:1759)
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
at com.sun.jna.Library$Handler.<init>(Library.java:147)
at com.sun.jna.Native.loadLibrary(Native.java:412)
at com.sun.jna.Native.loadLibrary(Native.java:391)
at net.sourceforge.tess4j.TessAPI.<clinit>(TessAPI.java:45)
at net.sourceforge.tess4j.Tesseract.init(Tesseract.java:283)
at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:219)
at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:168)
at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:152)
at ScanCards.ScanCards.extraction(ScanCards.java:64)
at ScanCards.ScanCards.scan(ScanCards.java:37)
at ScanCards.ScanCardsGUI.scanButtonActionPerformed(ScanCardsGUI.java:16
0)
at ScanCards.ScanCardsGUI.access$100(ScanCardsGUI.java:22)
at ScanCards.ScanCardsGUI$2.actionPerformed(ScanCardsGUI.java:73)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:20
22)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.jav
a:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259
)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
istener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6535)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6300)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4891)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888
)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Пока я могу сузить проблему до этой строки в моем коде:
String strResult = instance.doOCR( file);
Я проверил "файл", данный OCR. Это идеально тактовый.tif-образ (так или иначе, он прекрасно работает внутри Netbeans). Еще я подумал, что это может быть проблемой из-за того, что.jar не может найти необходимые библиотеки.sell для tesseract. Итак, скопировали необходимые.dll в папку "dist". Безуспешно. Я ввел tess4j-1.3.0.jar в библиотеку моего проекта.
Довольно странно, что внутри NetBeans все прекрасно работает. Я думаю, что мне не хватает ссылки на библиотеку, но я не могу думать ни о какой.
Это все, что я могу придумать, чтобы предоставить вам. Заранее спасибо!
1 ответ
Ну, я нашел какой-то обходной путь...
File dummy = new File( ScanCards.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParentFile().getParentFile();
String dirStr = dummy.getPath();
instance.setDatapath( dirStr);
String result = instance.doOCR( file);
На самом деле я все еще не могу запустить.jar-файл, но я могу запустить его из консоли. Поэтому вместо запускаемого файла.jar я просто использую командный файл (включая код 'java -jar PATH\TO\MY\FILE') для запуска программы.
Я думаю, что ключ находится в "java -jar", кажется, будто при открытии.jar напрямую java не загружается?