0

我正在尝试通过 Datafeed 工具箱编译使用 Bloomberg 的 APIv3 的 MATLAB 代码。代码在 MATLAB 中运行良好。编译器可以在没有 Java 的代码上正常工作。javaclasspath 通过以下方式引用 API:

DYNAMIC JAVA PATH

C:\blpv3\API\APIv3\JavaAPI\v3.7.1.1\lib\blpapi3.jar

我在编译时遇到了几个与 Java 相关的编译错误(下面的堆栈跟踪):

mcc -m -R -startmsg -R -completemsg -v my_prog.m

我想我需要告诉 mcc 更明确地链接到 blpapi3.jar,但是如何?我需要设置静态 Java 路径吗?

任何帮助将非常感激!


Warning: A Java exception occurred getting the method description for the
java.util.Locale class:

Java exception occurred:
java.lang.NoClassDefFoundError: com/bloomberglp/blpapi/Session
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source) 
    at java.lang.Class.privateGetPublicMethods(Unknown Source) 
    at java.lang.Class.getMethods(Unknown Source)
    at com.mathworks.jmi.OpaqueJavaInterface.doesMethodExist(OpaqueJavaInterface.java:407)
Caused by: java.lang.ClassNotFoundException: com.bloomberglp.blpapi.Session
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
... 5 more 
4

1 回答 1

0

经过更多的浏览和大量的试验,我已经解决了这个问题。答案已经在本网站的几篇文章中。无论如何,有几个问题......

1

看起来

发生 Java 异常:java.lang.NoClassDefFoundError

是运行时错误,而不是编译错误。为了解决这个问题,我更新了编译器和 MCR 中的 classpath.txt,位于,

$matlabroot\toolbox\local\classpath.txt

像这样

java类路径

    STATIC JAVA PATH

C:\Program Files\MATLAB\R2012a\java\patch                                                       
C:\blpv3\API\APIv3\JavaAPI\v3.7.1.1\lib\blpapi3.jar       

或者,可以将 blpapi3.jar 复制到

$matlabroot/java/jarext

与其他 JAR 文件一起。

此外,我删除了仅适用于 Matlab IDE 的动态 java 路径。

2

我已经在 startup.m 中禁用了 ADDPATH ,其中包含一个子句,例如

if ~isdeployed && ~ismcc addpath D:\Matlab ... end

3

mcc 的参数必须包括源文件所在的目录,即

mcc -m -I 'source_file_dir' -v top_level_function.m

4

在代码中处理文件时,参考相对于 $matlabroot,例如

如果已部署 sFile_Path = fullfile(matlabroot,'..','Input',sFile_Name); 否则 sFile_Path = which(sFile_Name); 结尾

5

请注意,MCR 的 $matlabroot 与 Matlab IDE 的 $matlabroot 不同。

于 2014-09-12T07:04:51.097 回答