ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

从Java ProcessBuilder启动Matlab,Matlab控制台没有出现在Mac OS 10.8中

2019-06-24 23:59:08  阅读:415  来源: 互联网

标签:java osx-mountain-lion matlab processbuilder


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

matlab -r "initMatlab;runJavaUI;"

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

所以…我们提供了一个Java可执行Jar,它根据你运行的操作系统自动生成命令行参数 – 用户只需双击它就可以显示一个小UI,然后会显示一些选项.我将这个罐子称为启动器.此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 ...");
    }
}

解决方法:

您需要通过使用-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库,则不会直接与此类或此方法进行交互.

标签:java,osx-mountain-lion,matlab,processbuilder
来源: https://codeday.me/bug/20190624/1283241.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有