Clase Java JPA para MATLAB

Estoy usando MATLAB R2007b, Java 1.6 SE, Eclipse Helios y MySql 5 en Windows XP Pro SP3.

Intento crear una biblioteca de clases que use anotaciones JPA para acceder a una base de datos MySql 5. La idea es que el script MATLAB crea una instancia de estos objetos Java, que proporcionan una API para acceder al DB.

Puedo crear mis clases anotadas, que funcionan dentro de Eclipse (es decir, la prueba JUnit). Puedo exportar el código a un jar, que puedo ejecutar desde un símbolo del sistema.

Actualizo el classpath Java de MATLAB usando javaaddpath (). Puedo crear una instancia de mi clase dentro de MATLAB. Pero cuando llamo a mi init (), que llama a javax.persistence.Persistence.createEntityManagerFactory (), obtengo el temido

“Sin proveedor de persistencia para EntityManager”

Este error generalmente significa que el archivo persistence.xml no está en el lugar correcto. Pero debe ser porque mi jar funciona desde la línea de comando. Agregar la carpeta META-INF al classpath Java de MATLAB no ayuda. Tampoco extrae el jar y agrega la estructura de la carpeta extraída al classpath, ya sea que se haya agregado META-INF o no.

¿Alguien tiene alguna idea, chiflado o no? ¿Alguien ha hecho esto en alguna versión de MATLAB?

Gracias.

-reilly

Bueno, encontré “una respuesta”. En algún lugar, antes de ver una publicación sobre la diferencia en los cp’s “dynamics” y “estáticos” de MATLAB. El CP “estático” es un archivo de texto que se carga al inicio. La cp “dinámica” se carga en tiempo de ejecución y normalmente la manipula con llamadas a m-script. Eso es lo que estaba tratando de hacer.

Así que agregué mis jar a la ruta dinámica y no funcionó.

Los agregué al final de la ruta estática y obtuve DIFERENTES errores, que parecían pertenecer al análisis XML. ¡Progreso!

Luego agregué mis jarros al COMIENZO de la ruta estática y funciona.

Para citar a Bart Simpson: Craptackular.

Gracias por todas tus ideas Pregúnteme una pregunta C # para que pueda corresponder …

-reilly

Mientras trabajaba con Java en MATLAB, a menudo me encontré con problemas con el classpath dynamic . Como solución alternativa, el uso de classpath.txt ha resuelto cualquier problema hasta el momento.

Trabajar con diferentes entornos, por ejemplo, pruebas y producción, da como resultado múltiples archivos classpath.txt en el directorio de inicio de MATLAB. El uso de diferentes versiones de MATLAB agrega otro multiplicador a la cantidad de archivos classpath.txt .

ClassPathHacker.java es una opción para agregar dinámicamente clases y archivos jar a su classpath estático . Usando este enfoque, ya no es necesario tocar classpath.txt . Su configuración Java classpath puede permanecer en el lugar previsto startup.m .

Esto es solo una continuación de su respuesta sobre classpaths estáticos vs dynamics. Aquí hay una función que le permitirá diagnosticar dónde se está cargando una clase de Java desde Matlab, y si hay alguna máscara de las definiciones de clase, que podría ser el motivo por el cual fue sensible a la realización de pedidos por usted. Es posible que vea otras colisiones; al menos dom4j.jar y commons-collections.jar se envían con Matlab, pero no sé qué versiones.

 function whereisjavaclassloadingfrom(ClassName) %WHEREISJAVACLASSLOADINGFROM Show where a Java class is loaded from % % whereisjavaclassloadingfrom(ClassName) % % Shows where a Java class is loaded from in this Matlab session's JVM. % This is for diagnosing Java class load problems, such as classpath % ordering issues, seeing if a class of a given name is included in an % unexpected JAR file, etc. % % Displays output to console. % % Examples: % % whereisjavaclassloadingfrom('java.util.HashMap') % whereisjavaclassloadingfrom('com.ldhenergy.etools.MxUtil') % whereisjavaclassloadingfrom('com.google.common.collect.Maps') % whereisjavaclassloadingfrom('org.apache.commons.math.complex.Complex') % Use javaArray to get Class object without having to instantiate. This % lets it work with objects that have private or non-zero-arg constructors, % and avoids side effects of object construction. % (Would use java.lang.Class.forName(), because that's a more direct way of % doing this, but it doesn't work for stuff on the dynamic classpath.) ja = javaArray(ClassName,1); klass = ja.getClass().getComponentType(); klassLoader = klass.getClassLoader(); if isempty(klassLoader) % JVM used null to represent the "bootstrap" class loader % I think that's the same as the "system" class loader klassLoader = java.lang.ClassLoader.getSystemClassLoader(); end klassLoaderStr = char(klassLoader.toString()); klassFilePath = [strrep(ClassName, '.', '/') '.class']; try % This logic assumes that the classes exist as files in the class % loader. It's a valid assumption for mainstream class loaders, % including the one's I've seen with Matlab. klassUrl = klassLoader.getResource(klassFilePath); if isempty(klassUrl) klassUrlStr = ''; else klassUrlStr = char(klassUrl.toString()); end catch err klassUrlStr = sprintf('ERROR: %s', err.message); end % Get all locations, to reveal masked definitions urls = enumeration2array(klassLoader.getResources(klassFilePath)); disp(sprintf('Version: %s\nClass: %s\nClassLoader: %s\nURL: %s', version,... char(klass.getName()), klassLoaderStr, klassUrlStr)); if numel(urls) > 1 disp('Class is masked:'); for i = 1:numel(urls) disp(sprintf('URL %d: %s', i, char(urls(i)))); end end %% function out = enumeration2array(jenum) tmp = {}; while jenum.hasMoreElements() tmp{end+1} = jenum.nextElement(); end out = [tmp{:}]; 

Asegúrese de tener un jar de proveedor JPA (como eclipselink.jar) en su classpath.

¿Está absolutamente seguro de haber escrito correctamente el nombre de la unidad de persistencia en la llamada a:

 javax.persistence.Persistence.createEntityManagerFactory(String puName) 

Eso también te daría el mismo error. El nombre es sensible a mayúsculas y minúsculas.