这是一个非常奇怪的应用程序,所以请耐心等待。主应用程序由一个 Matlab 后端和一个用 Java Swing 编写的 UI 组成。要启动应用程序,您可以从命令行执行以下操作:
matlab -r "initMatlab;runJavaUI;"
假设initMatlab
和runJavaUI
都是 Matlab 运行时路径上的 Matlab 函数,该路径是由该命令生成的。这基本上生成了一个 matlab 实例,然后在 matlab 启动后立即运行这两个 matlab 函数。奇怪的是,这个命令行选项不适用于所有操作系统。此外,并非所有版本的 Matlab 都与所有版本的 Java 兼容(我们的客户希望使用真正旧的 Matlab 安装......不能让他们改变它)。
所以......我们提供了一个 Java 可执行 Jar,它会根据您正在运行的操作系统自动生成命令行参数 - 用户只需双击它以显示一个小 UI,然后显示一些选项。我将这个 jar 称为Launcher。此启动器检测所有已安装的 Java 和 Matlab 实例,并允许用户选择将使用 Java 和 Matlab 的哪个组合。该 jar 用于ProcessBuilder
启动 matlab 命令,该命令工作正常,除了一件事。在Windows中,启动器启动 Matlab 就好了,我们看到 Matlab 控制台出现了,然后 Java UI 出现了。但是,在运行 Mountain Lion(我相信是 10.8)的 Mac 上,Matlab 控制台永远不会出现 - 这并不是说 Matlab 没有运行 - 我仍然可以从 Java UI 进行 Matlab 调用。这不会阻止用户使用 UI,但有时 Matlab 会将错误消息转储到有问题的控制台,因为在 Mac 上,用户永远不会知道什么时候出了问题。最奇怪的是,我尝试打印出生成的命令行,它在通过 启动时不会ProcessBuilder
产生 Matlab 控制台,但在通过终端启动时会产生 Matlab 控制台。再一次,Matlab 没有启动失败,它没有让自己的 UI 可见。
我曾尝试在启动 Matlab 之前将所有Launcher的环境变量复制到其中ProcessBuilder
,但无济于事。所以我不得不让这个有点开放,但有没有人尝试过使用 运行 Matlab ProcessBuilder
,如果是这样,你做了什么让 Matlab 控制台出现在 Mac OS Mountain Lion 上?
SSCCE
将此代码导出到可运行的 jar 文件中,然后在 Mac OS Mountain Lion 上运行以下命令:
java -jar launch-matlab.jar /absolute/path/to/matlab
您应该看到 Matlab 图标出现在 Dock 中,但您无法使 Matlab 控制台窗口可见。如果您在 Windows 中运行此程序,Matlab 控制台将按原样显示。
public class LaunchMatlab {
public static void main(String[] args) throws Exception{
String matlabExe = "matlab";
if(args != null && args.length > 0) matlabExe = args[0];
ProcessBuilder pb = new ProcessBuilder();
pb.command(matlabExe,"-wait");
pb.environment().putAll(System.getenv());
System.err.println("Launching Matlab using following PB args: "+
pb.command());
Process p = pb.start();
System.err.println("Waiting for Matlab to exit ...");
p.waitFor();
System.err.println("Matlab exited, launcher exiting ...");
}
}