用于MATLAB的Java JPA类

我在Windows XP Pro SP3上使用MATLAB R2007b,Java 1.6 SE,Eclipse Helios和MySql 5。

我试图创build一个使用JPA注释来访问MySql 5数据库的类库。 这个想法是,MATLAB脚本实例化这些Java对象,这些对象提供了访问数据库的API。

我可以创build我在Eclipse中工作的注释类(即JUnittesting)。 我可以将代码导出到jar,我可以从命令提示符运行。

我使用javaaddpath()更新MATLAB Java类path。 我可以在MATLAB中实例化我的类。 但是,当我调用我的init(),调用javax.persistence.Persistence.createEntityManagerFactory(),我得到了可怕的

“没有EntityManager的持久性提供者”

这个错误通常意味着persistence.xml文件不在正确的位置。 但是这一定是因为我的jar是从命令行工作的。 将META-INF文件夹添加到MATLAB java类path没有帮助。 也不提取jar并将提取的文件夹结构添加到classpath,无论是否添加了META-INF。

有没有人有任何想法,坚果或不? 有没有人曾经在任何版本的MATLAB中做过这个。

谢谢。

-reilly。

那么,我find了“答案”。 之前我看到一篇关于MATLAB的“dynamic”和“静态”CP差异的文章。 “静态”cp是在启动时加载的文本文件。 “dynamic”cp在运行时加载,通常使用m脚本调用进行操作。 这就是我想要做的。

所以我把我的jar子添加到dynamicpath,它不起作用。

我将它们添加到静态path的末尾,并得到了不同的错误,这似乎与XMLparsing有关。 进展!

然后我把我的jar子添加到静态path的开始,它的工作。

引用Bart Simpson:Craptackular。

感谢您的所有想法。 问我一个C#的问题,所以我可以回报…

-reilly。

在MATLAB中使用Java时,我经常遇到dynamic类path的问题。 作为一个解决方法,使用classpath.txt已经解决了迄今为止的任何问题。

处理不同的环境,例如testing和生产,会在MATLAB开始目录中产生多个classpath.txt文件。 使用不同的MATLAB版本为classpath.txt文件的数量增加了一个乘数。

ClassPathHacker.java是一个将dynamic类和jar文件添加到静态类path的选项。 使用这种方法,不再需要触摸classpath.txt 。 您的Java类pathconfiguration可以保留在预定位置startup.m

这只是对静态和dynamic类path的回答。 这里有一个函数可以让你诊断从Matlab内部加载的Java类的位置,以及是否有类的定义被掩盖,这可能是为什么它对你的sorting很敏感。 你可能会看到其他的碰撞; 至lessdom4j.jar和commons-collections.jar与Matlab一起发货,但我不知道是什么版本。

 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{:}]; 

确保您的类path中有JPA提供程序jar(例如eclipselink.jar)。

您是否完全确定您在呼叫中正确拼写了持久性单元的名称:

 javax.persistence.Persistence.createEntityManagerFactory(String puName) 

这也会给你同样的错误。 名称区分大小写。