アプリケーションの起動

クラスパスの取得方法は分かっりました。忘れないうちに WrpeLaunchConfigurationDelegate クラスに組み込んでおきます。

    private String[] extractClasspath(ILaunchConfiguration configuration, String home) throws CoreException {
        List<String> classpath = new ArrayList<String>();

        for (String path: getClasspath(configuration)) {
            classpath.add(path);
        }
        
        for (int i = 0; i < INIT_CLASSPATH.length; i++) {
            classpath.add(home + INIT_CLASSPATH[i]);
        }

        return classpath.toArray(new String[0]);
    }

それにしても何でこんなに配列使うんでしょうね。List にしてくれた方が扱いがずっと楽なのに...

さて、次です。今度は起動オプションです。

プログラムのオプションは AbstractJavaLaunchConfigurationDelegate#getProgramArguments メソッド、VM のオプションは AbstractJavaLaunchConfigurationDelegate#getVMArguments メソッドです。

これもどんな値が入るか試してみましょう。起動オプションとして、次のようなものを入れてみました。

Arguments

これを表示させているのが、次のコードです。

        String progArgs= getProgramArguments(configuration);
        System.out.println("Prog Args: [" + progArgs + "]");
        
        String vmArgs= getVMArguments(configuration);
        System.out.println("VM Args: [" + vmArgs + "]");

わざわざ括弧でくくっているのは、スペースなどが入っているかどうかをチェックするためです。

これで、実行してみました。

Prog Args: [abc def ghi jkl]
VM Args: [-Xmx512m -Dabc=efg]

やはり単一の String オブジェクトとして、区切られもせずに、代入されているようです。

ここまで分かれば後は、コードをゴリゴリ書くのみ。結局、こんなコードになりました。

public class WrpeLaunchConfigurationDelegate extends AbstractJavaLaunchConfigurationDelegate implements
        ILaunchConfigurationDelegate2 {
    private final static String INIT_CLASSPATH[] = {
        "/",
        "/lib/ext/lg3d-core.jar",
        "/ext/activation.jar",
        "/ext/escher-0.2.2.lg.jar",
        "/ext/j3d-contrib-utils.jar",
        "/ext/jaimlib.jar",
        "/ext/mail.jar",
        "/ext/nwn-0.7.jar",
        "/ext/odejava.jar",
        "/ext/satin-v2.3.jar"};

    private final static String INIT_VMARGS = "-Xmx512m -Dj3d.sortShape3DBounds=\"true\""
        + " -Dlg.configurl=file:///%1$s/etc/lg3d/lgconfig_1p_nox.xml"
        + " -Dlg.displayconfigurl=file:///%1$s/etc/lg3d/displayconfig/j3d1x1"
        + " -Dlg.etcdir=%1$s\\etc\\";

    public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
        String launchClass = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, (String)null);

        IPreferenceStore store = WrpePlugin.getDefault().getPreferenceStore();
        String home = store.getString(WrpePlugin.LG3D_PREF_HOME_KEY);

        String[] classpath = extractClasspath(configuration, home);

        String progArgs= getProgramArguments(configuration);
        
        Formatter formatter = new Formatter();
        formatter.format(INIT_VMARGS, home);
        String vmArgs = formatter.toString() + " " 
                                + getVMArguments(configuration);
        
        IVMInstall vmInstall = getVMInstall(configuration);
        IVMRunner vmRunner = vmInstall.getVMRunner(mode);

        VMRunnerConfiguration vmConfig= new VMRunnerConfiguration(launchClass, classpath);
        ExecutionArguments executionArguments = new ExecutionArguments(vmArgs, progArgs);
        vmConfig.setVMArguments(executionArguments.getVMArgumentsArray());
        vmConfig.setProgramArguments(executionArguments.getProgramArgumentsArray());
        vmConfig.setBootClassPath(null);   

        vmRunner.run(vmConfig, launch, null);
    }

    private String[] extractClasspath(ILaunchConfiguration configuration, String home) throws CoreException {
        List<String> classpath = new ArrayList<String>();

        for (String path: getClasspath(configuration)) {
            classpath.add(path);
        }
        
        for (int i = 0; i < INIT_CLASSPATH.length; i++) {
            classpath.add(home + INIT_CLASSPATH[i]);
        }

        return classpath.toArray(new String[0]);
    }
}

さて、実行だ!!!

実行