从java ProcessBuilder启动Matlab,Matlab控制台不会出现在Mac OS 10.8中



这是一个非常奇怪的应用程序,请耐心等待。主要应用程序由一个带有Java Swing编写的UI的Matlab后端组成。要启动应用程序,您可以从命令行执行以下操作:

matlab -r "initMatlab;runJavaUI;"

假设initMatlabrunJavaUI都是Matlab运行时路径上的Matlab函数,该运行时是该命令的结果。这基本上产生了一个matlab的实例,然后在matlab启动后立即运行这两个matlab函数。奇怪的是,这个命令行选项并不适用于所有操作系统。此外,并非所有版本的Matlab都与所有版本的Java兼容(我们的客户希望使用真正旧的Matlab安装……无法让他们更改它)。

所以。。。我们提供了一个Java可执行Jar,它可以根据您运行的操作系统自动生成命令行参数——用户只需双击它即可调出一个小UI,然后会显示一些选项。我将把这个jar称为Launcher。此Launcher检测所有已安装的Java和Matlab实例,并允许用户选择将使用Java和Matlab的组合。jar使用ProcessBuilder来启动matlab命令,除了一件事外,它运行良好。在Windows中,Launcher启动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中,但没有成功。所以我不得不让这件事有点开放,但有人尝试过使用ProcessBuilder运行Matlab吗?如果有,你做了什么让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 ...");
    }
}

您需要通过使用-desktop标志指定MATLAB在可见的UI中运行。我不相信这是有记录的。

所以你需要运行的命令是

matlab -desktop -r "initMatlab;runJavaUI;"

我创建了一个名为matlabcontrol的Java库,它可以从您那里抽象出所有这些。它可以在Windows、OS X和Linux上运行时启动MATLAB,然后允许您通过eval和feval命令与MATLAB交互。matlabcontrol用于启动MATLAB的代码位于matlabcontrol中。RemoteMatlabProxyFactory的createProcess(...)方法。如果将matlabcontrol用作Java库,则不会直接与此类或方法交互。

最新更新