gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:47:54 24 4
gpt4 key购买 nike

这是一个非常奇怪的应用程序,请耐心等待。主要应用程序由一个 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 中,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 上狮子?

中南合作商会

将此代码导出到可运行的 jar 文件中,然后在 Mac OS Mountain Lion 上运行以下命令:

java -jar launch-matlab.jar /absolute/path/to/matlab

您应该会看到 Matlab 图标出现在停靠栏中,但您将无法使 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.RemoteMatlabProxyFactorycreateProcess(...) 方法。如果您将 matlabcontrol 用作 Java 库,您将不会直接与此类或此方法交互。

关于java - 从 java ProcessBuilder 启动 Matlab,Matlab 控制台不会出现在 Mac OS 10.8 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17816385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com