4

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

matlab -r "initMatlab;runJavaUI;"

假设initMatlabrunJavaUI都是 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 ...");
    }
}
4

1 回答 1

4

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

所以你需要运行的命令是

matlab -desktop -r "initMatlab;runJavaUI;"

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

于 2013-07-30T07:59:48.720 回答