これは本当に奇妙なアプリケーションですので、ご容赦ください。主なアプリケーションは、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 ...");
}
}