これは本当に奇妙なアプリケーションですので、ご容赦ください。主なアプリケーションは、Java Swing で書かれた UI を備えた Matlab バックエンドで構成されています。アプリケーションを起動するには、コマンドラインから次のようにします。
matlab -r "initMatlab;runJavaUI;"
とが両方とも、そのコマンドの結果として生成される matlab ランタイムのパス上の Matlab 関数であるとしますinitMatlab
。runJavaUI
これは基本的に 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 ...");
}
}