アプリケーションの起動
クラスパスの取得方法は分かっりました。忘れないうちに 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 メソッドです。
これもどんな値が入るか試してみましょう。起動オプションとして、次のようなものを入れてみました。
これを表示させているのが、次のコードです。
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]); } }
さて、実行だ!!!