読者です 読者をやめる 読者になる 読者になる

起動

さて、起動です。

起動させるには、LaunchConfigurationDelegate の派生クラスである WrpeLaunchConfigurationDelegate クラスの launch メソッドを書けばいいということは分かります。

launch メソッドの引数は ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor です。monitor 以外はどこかで見たものばかりです。

ちなみに String mode には RUN と DEBUG という文字が入るようです。

ということは、LG3DLauncher クラスで起動させたときと同じような処理をすればよく、そのときに ILauch がそのままつかえそうです。

試しに、LG3DLauncher クラスからコピーしてきて、WrpeLaunchConfigurationDelegate に貼ってみました。とりあえず、試すだけのコードなのでリファクタリングしていなくてもよしとさせてください ^^;;

public class WrpeLaunchConfigurationDelegate extends LaunchConfigurationDelegate 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\\";
    private String prgArgs = "";

    public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, 
                                               IProgressMonitor monitor) throws CoreException {
        IPreferenceStore store = WrpePlugin.getDefault().getPreferenceStore();
        String home = store.getString(WrpePlugin.LG3D_PREF_HOME_KEY);

        String classpath[] = new String[INIT_CLASSPATH.length];
        for (int i = 0; i < INIT_CLASSPATH.length; i++) {
            classpath[i] = home + INIT_CLASSPATH[i];
        }
        
        Formatter formatter = new Formatter();
        formatter.format(INIT_VMARGS, home);
        String vmArgs = formatter.toString();

        IVMInstall vmInstall = JavaRuntime.getDefaultVMInstall();
        IVMRunner vmRunner = vmInstall.getVMRunner(mode);

        VMRunnerConfiguration vmConfig = new VMRunnerConfiguration("SimpleBox", classpath);
        ExecutionArguments executionArguments = new ExecutionArguments(vmArgs, prgArgs);
        vmConfig.setVMArguments(executionArguments.getVMArgumentsArray());
        vmConfig.setProgramArguments(executionArguments.getProgramArgumentsArray());
        vmConfig.setBootClassPath(null);   

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

このコードだと、決めうちで SimpleBox クラスを起動するようになっています。まぁ、それはそれとして、重要なことは launch メソッドの引数の launch をそのまま IVMRunner#run の引数に使えるかどうかを試したかったのです。
で、実行。

ちゃんと、実行することができました。もちろん、デバッグもおこなうことができます。よかった。

明日は実行するクラスなど、LG3D の起動に必要な情報を持ってくる方法を模索してみたいと思います。