这是一个非常奇怪的应用程序,所以请耐心等待。主应用程序包含一个带有用Java Swing编写的UI的Matlab后端。要启动应用程序,请从命令行执行以下操作:
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 中, 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
您应该会在Dock中看到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 ...");
}
}
答案 0 :(得分:4)
您需要通过使用-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库,则不会直接与此类或此方法进行交互。