Tomcat Plug-in 探求 その 2

runTomcatBootstrap メソッドを調べる

runTomcatBootstrap メソッドは 70 行ぐらいあるのですが、はじめの方は VM に対するオプションやクラスパスの設定をおこなっているだけでした。これらは必要に応じて調べればいいので、一番重要な部分を調べていきます。

        if(action == RUN) {
            VMLauncherUtility.runVM(getLabel(), getMainClass(),
                    classpath, bootClasspath, jvmArguments.toString(), programArguments.toString(), 
                    getSourceLocator(), isDebugMode(), showInDebugger);
        }

なんーだ、VMLauncherUtility クラスをコールしているだけなんですね。

それじゃ、VMLauncherUtility クラスを調べましょう。

VMLauncherUtility クラスを調べる

VMLauncherUtility クラスの runVM は次のようになっていました。

    static public void runVM(String label, String classToLaunch, String[] classpath, String[] bootClasspath, String vmArgs, String prgArgs, ISourceLocator sourceLocator, boolean debug, boolean showInDebugger)
        throws CoreException {

        IVMInstall vmInstall = getVMInstall();
        String mode = "";
        if (debug)
            mode = ILaunchManager.DEBUG_MODE;
        else
            mode = ILaunchManager.RUN_MODE;

        IVMRunner vmRunner = vmInstall.getVMRunner(mode);
//        Launch launch = createLaunch(label, classToLaunch, classpath, bootClasspath, vmArgs, prgArgs, sourceLocator, debug, showInDebugger, false);
        ILaunchConfigurationWorkingCopy config = createConfig(label, classToLaunch, classpath, bootClasspath, vmArgs, prgArgs, sourceLocator, debug, showInDebugger, false);
        Launch launch = new Launch(config, mode, sourceLocator);

        if (vmRunner != null) {
            VMRunnerConfiguration vmConfig = new VMRunnerConfiguration(classToLaunch, classpath);
            ExecutionArguments executionArguments = new ExecutionArguments(vmArgs, prgArgs);
            vmConfig.setVMArguments(executionArguments.getVMArgumentsArray());
            vmConfig.setProgramArguments(executionArguments.getProgramArgumentsArray());

            if (bootClasspath.length == 0) {
                vmConfig.setBootClassPath(null); // use default bootclasspath    
            } else {
                vmConfig.setBootClassPath(bootClasspath);
            }

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

        // Show in debugger
        if (showInDebugger) {
            DebugPlugin.getDefault().getLaunchManager().addLaunch(launch);
        }

    }

大体の流れを書き出すと

        IVMInstall vmInstall = getVMInstall();

        IVMRunner vmRunner = vmInstall.getVMRunner(...);

        Launch launch = new Launch(...);

        VMRunnerConfiguration vmConfig = new VMRunnerConfiguration(...);
        vmConfig の設定

        vmRunner.run(vmConfig, launch, null);

IVMInstall オブジェクトから IVMRunner オブジェクトを生成して、起動オプションの設定をおこなっているようです。そして、最後に run メソッドをコールします。

IVMInstall インタフェースがインストールされている JVM の情報を持っていて、実際に JVM を起動するには IVMRunner インタフェースを使用するわけですね。

IVMInstall オブジェクトを取得するメソッドだけ、VMLauncherUtility クラスで定義されています。

    static public IVMInstall getVMInstall() {
        IVMInstallType[] vmTypes = JavaRuntime.getVMInstallTypes();
        for (int i = 0; i < vmTypes.length; i++) {
            IVMInstall[] vms = vmTypes[i].getVMInstalls();
            for (int j = 0; j < vms.length; j++) {
                if (vms[j].getId().equals(TomcatLauncherPlugin.getDefault().getTomcatJRE())) {
                    return vms[j];
                }
            }
        }
        return JavaRuntime.getDefaultVMInstall();
    }

JavaRuntime クラスが IVMInstall オブジェクト取得するためのクラスのようです。

今まででてきた IVMInstall インタフェース、IVMRunner インタフェース、JavaRuntime クラス、VMRunnerConfiguration クラスはすべて org.eclipse.jdt.lunching パッケージで定義されているようです。

ただし、Launcher クラスだけは org.eclipse.debug.core パッケージみたいですね。

大体わかってきました。明日はこれを参考にして、LG3D を起動させるところを書いてみたいと思います。