2011-12-14 12 views
9

Ho un problema che mi sta facendo impazzire. Matlab vede solo alcune delle mie classi embeded in un file JARMatlab non può vedere alcune delle mie classi java (non tutte) nel pacchetto jar

Se compilo le classi al di fuori di un pacchetto e aggiungere il percorso della classe in Matlab utilizzando javaaddpath, non riscontra un problema

Quando ho compilare la classe in un pacchetto e quindi provare ad accedervi sotto Matlab, ho dei problemi. Sotto al codice Matlab

javaaddpath('/Users/me/Documents/workspace/EKGTest.jar'); 
clear java 
import com.neurosky.thinkgear.* 
methods('EkgSense') 

Methods for class com.neurosky.thinkgear.EkgSense: 

EkgSense     getClass     notify     reset    
addTemplate    getClassificationResults notifyAll     toString 
equals     hashCode     processData    wait 

methods('EkgEpoch') 

No methods for class EkgEpoch or no class EkgEpoch 

Ora, guardo nel pacchetto, tutte le classi sono pubbliche. Questo è il risultato di vaso -tf

osx:/Users/me/Documents/workspace> jar tf EKGTest.jar 
META-INF/MANIFEST.MF 
META-INF/REFACTORINGS.XML 
com/ 
com/neurosky/ 
com/neurosky/thinkgear/ 
com/neurosky/thinkgear/EkgEpoch.class 
com/neurosky/thinkgear/EkgEpoch.java 
com/neurosky/thinkgear/EkgParameters.class 
com/neurosky/thinkgear/EkgParameters.java 
com/neurosky/thinkgear/EkgTemplate.class 
com/neurosky/thinkgear/EkgTemplate.java 
com/neurosky/thinkgear/Matlab.class 
com/neurosky/thinkgear/Matlab.java 
com/neurosky/thinkgear/EkgSense.class 
com/neurosky/thinkgear/EkgSense.java 
com/neurosky/thinkgear/DistanceArray.class 
com/neurosky/thinkgear/DistanceArray.java 

e al di sotto di javap --classpath

osx:/Users/me/Documents/workspace> javap -classpath /Users/me/Documents/workspace/EKGTest.jar com.neurosky.thinkgear.EkgEpoch 
Compiled from "EkgEpoch.java" 
public class com.neurosky.thinkgear.EkgEpoch extends java.lang.Object implements java.lang.Cloneable{ 
    public int numberOfSamples; 
    public float[] data; 
    public com.neurosky.thinkgear.EkgEpoch(int); 
    public com.neurosky.thinkgear.EkgEpoch(int, float[]); 
    public com.neurosky.thinkgear.EkgEpoch(float[]); 
    public com.neurosky.thinkgear.EkgEpoch(com.neurosky.thinkgear.EkgEpoch); 
    public com.neurosky.thinkgear.EkgEpoch(org.json.JSONArray); 
    public org.json.JSONArray toJSONArray(); 
    public static float[] convolve(float[], float[]); 
    public float getLineNoiseAmplitude(); 
    public com.neurosky.thinkgear.EkgEpoch subtract(com.neurosky.thinkgear.EkgEpoch); 
    public com.neurosky.thinkgear.EkgEpoch subEpoch(int, int); 
    public com.neurosky.thinkgear.EkgEpoch square(); 
    public com.neurosky.thinkgear.EkgEpoch subtract(float); 
    public com.neurosky.thinkgear.EkgEpoch diff(); 
    public boolean exceedValue(float, int, int); 
    public com.neurosky.thinkgear.EkgEpoch smooth(int); 
    public float mean(); 
    public float sum(); 
    public float max(); 
    public float median(); 
    public com.neurosky.thinkgear.EkgEpoch clone(); 
    public com.neurosky.thinkgear.EkgEpoch sort(); 
    public int[] sortIndices(com.neurosky.thinkgear.EkgEpoch); 
    public float std(); 
    public int find_heart_beats(int[], float); 
    public com.neurosky.thinkgear.EkgEpoch detrend(); 
    public java.lang.Object clone()  throws java.lang.CloneNotSupportedException; 
} 

osx:/Users/me/Documents/workspace> javap -classpath /Users/me/Documents/workspace/EKGTest.jar com.neurosky.thinkgear.EkgSense 
Compiled from "EkgSense.java" 
public class com.neurosky.thinkgear.EkgSense extends java.lang.Object{ 
    public com.neurosky.thinkgear.EkgParameters params; 
    public com.neurosky.thinkgear.EkgTemplate[] templates; 
    public com.neurosky.thinkgear.EkgTemplate currentData; 
    public int lastTemplateInd; 
    public float lastEpochValue; 
    public com.neurosky.thinkgear.EkgSense(com.neurosky.thinkgear.EkgParameters); 
    public void reset(); 
    public void addTemplate(java.lang.String, float[][]); 
    public void addTemplate(com.neurosky.thinkgear.EkgTemplate); 
    public java.lang.String getClassificationResults(); 
    public boolean processData(float[]); 
} 

Sono in esecuzione Matlab su OSX. Ho provato con Matlab 7.7.0.471 (R2008b) e 7.11.0.584 (R2010b) e ho avuto lo stesso problema. Entrambi Matlab utilizzano il Java OSX nativo (Java 1.6.0_26-b03-384-10M3425 con Apple Inc. Java HotSpot (TM) modalità VM server a 64 bit mista) che dovrebbe essere uguale a quello in Eclipse (ho controllato ed Eclipse si compila con 1.6).

Ricordare che non riesco a vedere la classe mancante nessun problema quando rimuovo l'istruzione del pacchetto e alcune importazioni nella parte superiore dei file java (in tutte le classi ovviamente) e quando aggiungo semplicemente il percorso ai file .class (non accedervi in ​​un file JAR).

Qualsiasi aiuto sarebbe molto apprezzato. Grazie,

Jason

+0

Se hai trovato una soluzione, mettete in una risposta e lo accetto te stesso. In questo modo, gli altri lo troveranno più facilmente. –

risposta

13

alla fine ho trovato il problema che non può essere visto sopra. Il problema (non documentato da nessuna parte) è che alcune delle mie classi utilizzano pacchetti esterni che non avevo importato in Matlab. Non avevo intenzione di utilizzare nessuna delle funzionalità collegate a questi pacchetti.

Tuttavia, il messaggio di errore Matlab che non riesce a trovare la classe è sconcertante. Un messaggio di errore che indica che la classe non può essere utilizzata perché alcuni pacchetti non sono referenziati sarebbe molto utile.

Se il pacchetto utilizza i pacchetti esterno, verificare che per importare tutti i file JAR SOTTO Matlab o alcune classi NON SARANNO US

Un altro suggerimento che ho trovato utile è che la funzione "Importa" Matlab non restituirà un errore se si immette un pacchetto che non esiste con * "import java.doesnotexist. *" funziona correttamente. Tuttavia, "import java.doesnotexist.aclass" non funzionerà.

Jason

+0

Grazie mille per quello. Questo è un fallimento esasperante di Matlab. – SColvin

+1

Grazie mille per il Q & A. Questo in realtà mi ha aiutato a risolvere il problema simile che stavo avendo :) –

+0

Devi accettare la tua risposta come la migliore risposta per questa domanda :) – Sadjad

1

Un altro motivo di MATLAB non vedrà una classe è quando si compila per JRE7 e si utilizza MATLAB 2012b (probabilmente vale per altri MATLAB rilascia).

Lo symtom è l'errore estremamente zoppo

The class "JavaNuServer" is undefined. 
Perhaps Java is not running. 

Soluzione:

Compilare con le bandiere javac

-source 1.6 -target 1.6 
0

Per completare la risposta accettata - c'è un modo di gran lunga migliore per verificare se la classe java è stata caricata in modo appropriato, anziché tramite il comando import. Utilizzare la funzione whereisjavaclassloadingfrom, fornita da Andrew Janke in this answer.

Non solo vi dirà se la classe viene caricata, elencherà tutti barattoli che questa classe è disponibile in. Succede abbastanza spesso che la classe viene mascherato/oscurato da un'altra classe con lo stesso pacchetto/nome , situato in un vaso diverso. Ciò può accadere per es. se si tenta di utilizzare una libreria più recente di quella fornita con Matlab e non collocarla sopra quella originale sul classpath java statico.

0

Questo stesso problema può essere causato da più tipi di guasti. (Tutti frustranti dal momento che non ottieni informazioni su ciò che è fallito!) La risposta accettata descrive una ragione e la soluzione. La risposta di Wolfgang Kuehn arriva a un altro possibile problema, anche se ho avuto difficoltà a capire il punto, quindi ho deciso di scrivere la mia risposta espandendola leggermente più in generale:

Ogni versione di Matlab viene fornita con un JRE specifico che viene eseguito e supportato . Versione diversa di Matlab con versione diversa di JRE. Non importa quale versione di Matlab e JRE associato hai, se hai rispettato le tue classi Java esterne che sono nel file jar con una versione superiore (e incompatibile) del compilatore Java, Matlab rifiuterà di riconoscere le classi anche se sono in il vaso. Se sei fortunato, puoi risolvere questo problema ricompilando Java con un flag che specifichi la compatibilità con la versione di Java nella tua istanza di Matlab.

Per scoprire quale versione di Java vostro Matlab è in esecuzione, utilizzare questo comando al prompt dei comandi di Matlab:

version -java

Problemi correlati