0

画像を取得し、tesseract を使用して画像からデータを抽出する小さなツールをプログラムしました。64 ビット Windows 7 マシンの Netbeans で Java を使用しました。これまでのところ、プログラムは完全に正常にコンパイルされ、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-image です (とにかく Netbeans 内でうまく動作するため)。私が考えたもう1つのことは、.jarがtesseractに必要な.dllを見つけられないという問題である可能性があります。そのため、必要な .dll を「dist」フォルダーにコピーしました。どちらも成功しませんでした。プロジェクトのライブラリに tess4j-1.3.0.jar をインバウンドしました。

NetBeans 内ですべてが完全に正常に動作するのは非常に奇妙です。ライブラリへのリンクを見逃していると思いますが、何も考えられません。

あなたに提供するために私が考えることができるのはそれだけです。前もって感謝します!

4

1 に答える 1

0

さて、私はある種の回避策を見つけました...

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がロードされていないように見えますか?

于 2016-08-10T06:55:32.290 に答える