12

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。

那么解决这个问题的最佳方法是什么?

4

4 回答 4

13

我得到了 Mathworks 的官方回复:

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

<before>

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 环境变量,但我们可以在解决方法中使用它,以允许在 toolbox/local 目录之外读取自定义的 classpath.txt。

在 Windows 上:

您将需要创建 MATLABPATH 环境变量。它的第一个目录应该是您的带有自定义 classpath.txt 的目录,并且您还需要添加 toolbox\local 目录作为第二个选项。因此,您可以从 cmd 提示符执行以下操作:

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

于 2013-05-07T19:47:21.350 回答
2

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

于 2013-05-03T19:24:05.610 回答
1

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

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

这似乎有点骇人听闻,但根据受众的不同,它可能比向用户教授静态与动态类路径要容易得多,而且它不会破坏任何依赖于旧行为的 matlab 代码。

于 2013-12-30T22:46:53.243 回答
1

而不是像@user2443532 建议的那样混淆包,我发现“遮蔽”冲突的包而不是混淆它更容易——除非你真的需要混淆。一种简单的方法是使用 Maven 构建您的包并使用maven-shade-plugin. 内部调用会自动修改,因此您无需修改​​任何 Java 代码。

来自 Matlab 的直接调用将需要修改 - 例如,调用com.opensource.Class成为shaded.com.opensource.Class.

有关着色的更多信息,请参阅什么是 maven-shade-plugin 用于,以及为什么要重新定位 Java 包?

于 2019-03-11T16:50:21.950 回答