4

これは本当に奇妙なアプリケーションですので、ご容赦ください。主なアプリケーションは、Java Swing で書かれた UI を備えた Matlab バックエンドで構成されています。アプリケーションを起動するには、コマンドラインから次のようにします。

matlab -r "initMatlab;runJavaUI;"

とが両方とも、そのコマンドの結果として生成される matlab ランタイムのパス上の Matlab 関数であるとしますinitMatlabrunJavaUIこれは基本的に matlab のインスタンスを生成し、matlab の起動直後にこれら 2 つの matlab 関数を実行します。奇妙なことに、このコマンドライン オプションはすべての OS で機能するとは限りません。さらに、Matlab のすべてのバージョンが Java のすべてのバージョンと互換性があるわけではありません (当社の顧客は、非常に古い Matlab インストールを使用したいと考えています...変更を強制することはできません)。

そのため ... 実行している OS に基づいてコマンドライン引数を自動的に生成する 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 では、何か問題が発生したときにユーザーが認識できないためです。最も奇妙なことは、生成されたコマンドラインを印刷しようとしたことです。これは、を介して起動されたときに Matlab コンソールを生成しませんProcessBuilder、ターミナルを介して起動されたときに 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 アイコンが表示されるはずですが、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 と対話できます。MATLAB を起動するための matlabcontrol のコードは、matlabcontrol.RemoteMatlabProxyFactorycreateProcess(...)メソッドにあります。Java ライブラリとして matlabcontrol を使用する場合、このクラスまたはこのメソッドと直接対話することはありません。

于 2013-07-30T07:59:48.720 に答える