Dentro do meu projeto no Eclipse funciona normalmente, porém, quando jogo para um arquivo Jar e executo, aparece a seguinte mensagem de erro,
Estou utilizando o Tesseract, acho que o problema seja isso, o que poderá ser feito?
Exception in thread “AWT-EventQueue-0” java.lang.UnsatisfiedLinkError: Não foi p
ossível encontrar o módulo especificado.
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.util.LoadLibs.getTessAPIInstance(LoadLibs.java
:81)
at net.sourceforge.tess4j.TessAPI.(TessAPI.java:42)
at net.sourceforge.tess4j.Tesseract.init(Tesseract.java:379)
at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:292)
at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:224)
at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:208)
at agassys.teste.getOcr(teste.java:3485)
at agassys.teste$18.actionPerformed(teste.java:2248)
at javax.swing.JComboBox.fireActionEvent(Unknown Source)
at javax.swing.JComboBox.contentsChanged(Unknown Source)
at javax.swing.AbstractListModel.fireContentsChanged(Unknown Source)
at javax.swing.DefaultComboBoxModel.setSelectedItem(Unknown Source)
at javax.swing.DefaultComboBoxModel.addElement(Unknown Source)
at javax.swing.JComboBox.addItem(Unknown Source)
at agassys.Abrir_Projeto$4.actionPerformed(Abrir_Projeto.java:234)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
O estranho é que no Eclipse ele funciona normalmente,
Quando exporto ele para Runnable JAR File, e transformo ele em um arquivo, ele começa a dar esse erro
Em princípio só tens que passar como argumento para a máquina virtual a propriedade java.library.path apontando para o diretório onde sua DLL se encontra.
Não porque não é o sistema operacional quem vai utilizar, é a aplicação dele.
É só setar a propriedade java.library.path apontando o diretório onde estão as DLLs que a aplicação dele depende.
Que eu saiba o java.library.path tem que ser setado como parâmetro da máquina virtual, usando a opção -D
Não sei se vai surtir efeito usando System.setProperty
Mas, se você for teimosinho e insistir em não utilizar o -D, dá pra dar uma “hackeada” e colocar o seguinte bloco estático na sua classe com método main:
Esse código seta o atributo sys_paths do ClassLoader pra null, fazendo com que ele seja reinicializado.
Quando ele for reinicializado, ele vai ler a propriedade que você setou com o System.setProperty.
Mas não é legal fazer isso pois:
vai diretamente contra o conceito de encapsulamento, já que estamos modificando um atributo private do ClassLoader;
por ser um atributo private do ClassLoader, amanhã ou depois a Oracle pode mudar a implementação e seu código vai deixar de funcionar.