JUnit Plug-in での起動を調べる その 4
今日は、envp という変数からです。
String[] envp= DebugPlugin.getDefault().getLaunchManager().getEnvironment(configuration);
これを WrpeLaunchConfigurationDelegate#launch メソッドに組み込んで試してみました。
String[] envp= DebugPlugin.getDefault().getLaunchManager().getEnvironment(configuration);
if (envp != null) {
for (String env: envp) {
System.out.println("Env: " + env);
}
} else {
System.out.println("Envp = null");
}これで実行すると
Envp = null
と表示されてしまいます。これじゃ、何の値か分からないですね。困るんだけど、まぁいいや、先に進めよう。
次がやっと VMRunnerConfiguration オブジェクトの生成です。これをおこなっているのが createVMRunner メソッドですが、JUnitBaseLaunchConfiguration クラスではなく、派生クラスの方の JUnitLaunchConfiguration クラスで定義されています。
protected VMRunnerConfiguration createVMRunner(ILaunchConfiguration configuration, IType[] testTypes, int port, String runMode) throws CoreException {
String[] classPath= createClassPath(configuration);
String progArgs= getProgramArguments(configuration);
VMRunnerConfiguration vmConfig= new VMRunnerConfiguration("org.eclipse.jdt.internal.junit.runner.RemoteTestRunner", classPath); //$NON-NLS-1$
String testName= configuration.getAttribute(JUnitBaseLaunchConfiguration.TESTNAME_ATTR, ""); //$NON-NLS-1$
String testFailureNames= configuration.getAttribute(JUnitBaseLaunchConfiguration.FAILURES_FILENAME_ATTR, ""); //$NON-NLS-1$
// insert the program arguments
Vector argv= new Vector(10);
ExecutionArguments execArgs = new ExecutionArguments("", progArgs); //$NON-NLS-1$
String[] pa= execArgs.getProgramArgumentsArray();
for (int i= 0; i < pa.length; i++) {
argv.add(pa[i]);
}
argv.add("-version"); //$NON-NLS-1$
argv.add("3"); //$NON-NLS-1$
argv.add("-port"); //$NON-NLS-1$
argv.add(Integer.toString(port));
//argv("-debugging");
if (keepAlive(configuration) && runMode.equals(ILaunchManager.DEBUG_MODE))
argv.add(0, "-keepalive"); //$NON-NLS-1$
// a testname was specified just run the single test
if (testName.length() > 0) {
argv.add("-test"); //$NON-NLS-1$
argv.add(testTypes[0].getFullyQualifiedName()+":"+testName); //$NON-NLS-1$
} else if (testTypes.length > 1) {
String fileName= createTestNamesFile(testTypes);
argv.add("-testNameFile"); //$NON-NLS-1$
argv.add(fileName);
} else {
argv.add("-classNames"); //$NON-NLS-1$
for (int i= 0; i < testTypes.length; i++)
argv.add(testTypes[i].getFullyQualifiedName());
}
if (testFailureNames.length() > 0) {
argv.add("-testfailures"); //$NON-NLS-1$
argv.add(testFailureNames);
}
String[] args= new String[argv.size()];
argv.copyInto(args);
vmConfig.setProgramArguments(args);
return vmConfig;
}ちょっとソース追うのたいへんかもしれない ^^;;
地道にやっていきましょう。
まずは createClassPath メソッドですね。
private String[] createClassPath(ILaunchConfiguration configuration) throws CoreException {
URL runtimeURL= Platform.getBundle("org.eclipse.jdt.junit.runtime").getEntry("/"); //$NON-NLS-1$ //$NON-NLS-2$
URL url= Platform.getBundle(JUnitPlugin.PLUGIN_ID).getEntry("/"); //$NON-NLS-1$
String[] cp= getClasspath(configuration);
String[] classPath= null;
try {
if (Platform.inDevelopmentMode()) {
// we first try the bin output folder
List junitEntries= new ArrayList();
try {
junitEntries.add(Platform.asLocalURL(new URL(url, "bin")).getFile()); //$NON-NLS-1$
} catch (IOException e3) {
try {
junitEntries.add(Platform.asLocalURL(new URL(url, "junitsupport.jar")).getFile()); //$NON-NLS-1$
} catch (IOException e4) {
// fall through
}
}
try {
junitEntries.add(Platform.asLocalURL(new URL(runtimeURL, "bin")).getFile()); //$NON-NLS-1$
} catch (IOException e1) {
try {
junitEntries.add(Platform.asLocalURL(new URL(runtimeURL, "junitruntime.jar")).getFile()); //$NON-NLS-1$
} catch (IOException e4) {
// fall through
}
}
Assert.isTrue(junitEntries.size() == 2, "Required JARs available"); //$NON-NLS-1$
classPath= new String[cp.length + junitEntries.size()];
Object[] jea= junitEntries.toArray();
System.arraycopy(cp, 0, classPath, 0, cp.length);
System.arraycopy(jea, 0, classPath, cp.length, jea.length);
} else {
classPath= new String[cp.length + 2];
System.arraycopy(cp, 0, classPath, 0, cp.length);
classPath[cp.length]= Platform.asLocalURL(new URL(url, "junitsupport.jar")).getFile(); //$NON-NLS-1$
classPath[cp.length + 1]= Platform.asLocalURL(new URL(runtimeURL, "junitruntime.jar")).getFile(); //$NON-NLS-1$
}
} catch (IOException e) {
JUnitPlugin.log(e); // TODO abort run and inform user
}
return classPath;
} このメソッドも長いなぁ。
普通の CLASSPATH は AbstractJavaLaunchConfigurationDelegate#getClasspath メソッドで取得できるようです。取得できたものを出力させてみたら
String[] classPath= getClasspath(configuration);
for (String cp: classPath) {
System.out.println("CLASSPATH: " + cp);
}CLASSPATH: D:\users\sakuraba\runtime-EclipseApplication\sample CLASSPATH: D:\lg3d\lib\ext\lg3d-core.jar
と出力されました。上がプロジェクトのソースが置いてあるところなので、ちゃんとそれも含まれているようです。
これでいいのにと思うのですが、この後のコードは何なのでしょうか。JUnit Plug-in では Plug-in 自体を CLASSPATH に含めなくてはいけないので、それを考慮したコードになっているようです。
このコードは今は参考にしませんが、いずれ LG3D を起動したままで、後からアプリケーションを起動するようなときに使えそうです。