覆盖MATLAB默认静态javaclasspath的最佳方法

MATLAB配置为在搜索用户可修改的动态路径之前搜索其静态java类路径。 不幸的是,静态路径包含相当多的非常旧的公共库,因此如果您尝试使用新版本,最终可能会加载错误的实现并获得错误。

例如,静态路径包含google-collections.jar的旧副本,该副本长期以来被Google的guava库取代,并且具有一些相同的类名(例如com.google.common.base.Objects)。 因此,如果你调用一个使用这种类之一的新方法的Guava方法,你最终会得到令人惊讶的NoSuchMethodErrors,因为首先找到了google-collections jar。

从R2012b开始,MATLAB允许您通过在首选项文件夹中放置javaclasspath.txt文件来指定要添加到静态路径的其他jar,但是将jar添加到路径的末尾,并且不允许您覆盖生成的jar进入MATLAB。

那么最好的解决方法是什么?

我收到了Mathworks的正式回复:

从MATLAB R2013a(也在R2012b中)开始,通过在javaclasspath.txt中包含以下行,可以将类添加到静态Java类路径的前面:

 

javaclasspath.txt中此行之后的任何目录都将添加到静态Java类路径的前面。 从R2013a开始,这是对javaclasspath.txt的未记录使用。

但总体而言,在MATLAB中,通过MATLAB 8.0(R2012b)中的javaclasspath.txt无法将类添加到静态Java类路径的前端。

MATLAB按以下顺序搜索classpath.txt:

  1. 在启动目录中。 从MATLAB 8.0(R2012b)开始,如果在那里找到文件,将显示一个警告,它将被忽略。

  2. 在MATLABPATH环境变量的第一个目录中。 (此环境变量在Linux上的bin / matlab shell脚本中使用,通常最终用户不使用)。

  3. 在工具箱/本地目录中。

虽然最终用户通常不使用第2点的MATLABPATH环境变量,但我们可以在变通方法中使用它来允许读取工具箱/本地目录之外的自定义classpath.txt。

在Windows上:

您需要创建MATLABPATH环境变量。 它上面的第一个目录应该是你的自定义classpath.txt的目录。你还需要添加toolbox \ local目录作为第二个选项。 所以从cmd提示符你可以做到:

设置MATLABPATH = c:\ Users \ user \ Documents \ myMATLABClasspath; c:\ Program Files \ MATLAB \ R2012b \ toolbox \ local matlab.exe

一个似乎有用的黑客是将jar添加到classpath.txt文件的顶部,该文件可以在MATLAB安装工具箱/本地文件夹中找到。 不幸的是,这是自动生成的,并且可能会在某些未指定的时间重写,例如当您安装新工具箱时,因此这种方法需要您在发生这种情况时有一些方法可以注意并重新应用黑客攻击。

如果您要分发一个打算与matlab一起使用的jar,最好使用http://code.google.com/p/guava-libraries/wiki/UsingProGuardWithGuava中所述的proguard。

如果指定要保留所有类及其(公共)字段和方法并将guava包含为程序jar(而不是库),则它将重命名所有guava的方法并更新已编译的字节码以引用新的名。

这看起来有点像hackish,但是根据受众的不同,它可能比教你的用户关于静态类和动态类路径要容易得多,并且它不会破坏任何依赖于旧行为的matlab代码。