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

Chr*_*ber 11 java matlab classpath

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.

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

Chr*_*ber 11

我收到了Mathworks的正式回复:

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

<before>
Run Code Online (Sandbox Code Playgroud)

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

  • @Amro:仅供参考,我在http://stackoverflow.com/a/22524112/105904上汇总了ClassPathHacker的M代码版本.在Matlab中使用静态类路径黑客攻击有几个问题; 特别是,javaclasspath()的输出不反映更改.我将错误报告给MathWorks. (2认同)

Chr*_*ber 2

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