2011-12-14 13 views
9

Tengo un problema que me está volviendo loco. Matlab sólo ve algunas de mis clases embebidos en un archivo JARMatlab no puede ver algunas de mis clases de Java (no todas) en el paquete jar

Si puedo compilar las clases fuera de un paquete y añadir la ruta de la clase en Matlab usando javaaddpath, no me encontré con ningún problema

Cuando compilar la clase en un paquete y luego intentar acceder a ellos bajo Matlab, tengo problemas. Debajo de algunos códigos de 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 

Ahora, miro en el paquete, todas las clases son públicas. Este es el resultado de la jarra -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 

y por debajo de 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[]); 
} 

Me postulo Matlab en OSX. Lo he intentado con Matlab 7.7.0.471 (R2008b) y 7.11.0.584 (R2010b) y tengo el mismo problema. Ambos Matlab están utilizando el OSX Java nativo (Java 1.6.0_26-b03-384-10M3425 con el modo mixto de Apple Inc. Java HotSpot (TM) 64-Bit Server) que debería ser el mismo que el de Eclipse (he comprobado y Eclipse compila con 1.6).

Recuerda que puedo ver la clase que falta sin problemas cuando elimino la instrucción del paquete y algunas importaciones en la parte superior de los archivos java (en todas las clases, por supuesto) y cuando simplemente agrego la ruta a los archivos .class (no acceder a ellos en un archivo JAR).

Cualquier ayuda sería muy apreciada. Gracias ,

Jason

+0

Si has encontrado una solución, lo puso en una respuesta y lo acepta tú mismo. De esa forma, otros lo encontrarán más fácilmente. –

Respuesta

13

Finalmente he encontrado el problema que no puede ser visto anteriormente. El problema (no documentado en ninguna parte) era que algunas de mis clases usaban paquetes externos que no había importado a Matlab. No estaba planeando usar ninguna de las funcionalidades relacionadas con estos paquetes.

Sin embargo, el mensaje de error de Matlab de que no puede encontrar la clase es desconcertante. Un mensaje de error que indica que la clase no se puede usar porque algunos paquetes no están referenciados sería más útil.

si su paquete USOS PAQUETES EXTERNOS, asegúrese de importar todos los archivos JAR BAJO MATLAB o algún clases no será de US

Otro consejo que he encontrado útil es que la función de "importación" de Matlab no devolverá una error si ingresa un paquete que no existe con * "import java.doesnotexist. *" funciona bien. Sin embargo, "import java.doesnotexist.aclass" no funcionará.

Jason

+0

Muchas gracias por eso. Este es un lapso enloquecedor por Matlab. – SColvin

+1

Muchas gracias por las preguntas y respuestas. Esto realmente ayudó a resolver el problema similar que estaba teniendo :) –

+0

Tienes que aceptar tu respuesta como la mejor respuesta para esta pregunta :) – Sadjad

1

Otra razón MATLAB no quiere ver una clase es cuando se compila para JRE7 y está utilizando MATLAB 2012b (probablemente se aplica a otros MATLAB libera).

El Síntoma es el error extremadamente cojos

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

Solución:

Compilar con las banderas javac

-source 1.6 -target 1.6 
0

para complementar la respuesta aceptada - hay una manera mucho mejor para comprobar si La clase java se cargó propertly, que a través del comando import. Utilice la función whereisjavaclassloadingfrom, proporcionada por Andrew Janke en this answer.

No sólo le dirá si se carga la clase, listará todos frascos que esta clase está disponible en. Ocurre a menudo que su clase se enmascara/eclipsada por otra clase con un mismo paquete/nombre , ubicado en un recipiente diferente. Eso puede suceder, p. si intenta utilizar una biblioteca más nueva que una de las enviadas con Matlab, y no la coloque por encima de la original en el classpath java estático.

0

Este mismo problema puede deberse a varios tipos de fallas. (¡Todos son frustrantes ya que NO recibe información sobre lo que falló!) La respuesta aceptada describe una razón y la solución. La respuesta de Wolfgang Kuehn llega a otro posible problema, aunque tuve problemas para entender el punto, así que decidí escribir mi propia respuesta expandiéndolo un poco más en general:

Cada versión de Matlab viene con algunos JRE específicos que se ejecutan y admiten . Versión diferente del barco Matlab con una versión diferente del JRE. Sin importar qué versión de Matlab y JRE asociada tenga, si cumplió con las clases externas de Java que están en el archivo jar con una versión más alta (e incompatible) del compilador de Java, Matlab rechazará reconocer las clases aunque estén en el jarro Si tiene suerte, puede solucionar esto recompilando Java con un indicador que especifique la compatibilidad con la versión de Java en su instancia de Matlab.

Para saber qué versión de Java su Matlab se está ejecutando, utilice este comando en el indicador de comandos del Matlab:

version -java

0

me encontré con el mismo problema hace un momento. La solución es actualizar la versión de Java MATLAB mediante el establecimiento de un nuevo parámetro envir mencionado aquí

https://cn.mathworks.com/matlabcentral/answers/130359-how-do-i-change-the-java-virtual-machine-jvm-that-matlab-is-using-on-windows

Matlab chupa en el mensaje de error

+0

Si es posible, sería bueno resumir los pasos clave aquí, para que esta respuesta pueda ser independiente como una solución. – Adam

Cuestiones relacionadas