現在のJavaプロジェクトから1つのJavaプログラムを実行します。複数のjar依存関係があり、実行前にクラスパスに追加する必要があります。まず私は、通常のjavaコマンドを使用して実行してみました -実行時にjavaで複数のクラスパスエントリを設定するには?
String classDir = "";
for (int i = 0; i < compilerConfiguration.getClasspathEntries().size(); i++) {
classDir = classDir + compilerConfiguration.getClasspathEntries().get(i) + ";";
}
runProcess("java -cp " + classDir + " topLevelProject.com.test.project.App");
private static void runProcess(String command) throws Exception {
Process pro = Runtime.getRuntime().exec(command);
printLines(command + " stdout:", pro.getInputStream());
printLines(command + " stderr:", pro.getErrorStream());
pro.waitFor();
System.out.println(command + " exitValue() " + pro.exitValue());
}
しかし、複数のクラスパスのエントリがあるとして、それは私にエラーを与える -
java.io.IOException: Cannot run program "java": CreateProcess error=206, The filename or extension is too long
classDirの内容は多少このようなものです -
E:\test\maven\com.test.project\target\classes;C:\Users\dd\.m2\repository\p2\osgi\bundle\com.t.cep.studio.cli\5.3.0.164\com.t.cep.studio.cli-5.3.0.164.jar[+com/t/cep/studio/cli/studiotools/*;?**/*];C:\Users\dd\.m2\repository\p2\osgi\bundle\org.eclipse.core.runtime\3.11.1.v20150903-1804\org.eclipse.core.runtime-3.11.1.v20150903-1804.jar[~org/eclipse/core/internal/preferences/legacy/*;~org/eclipse/core/internal/runtime/*;+org/eclipse/core/runtime/*;?**/*];
あるいは、javaコマンドを実行する前にクラスパスを動的に設定しようとしました。
try {
for (int i = 0; i < compilerConfiguration.getClasspathEntries().size(); i++) {
String filePath = "file://" + compilerConfiguration.getClasspathEntries().get(i);
URL[] url = { new URL(filePath) };
ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
URLClassLoader urlClassLoader = new URLClassLoader(url, currentThreadClassLoader);
Thread.currentThread().setContextClassLoader(urlClassLoader);
}
runProcess("java topLevelProject.com.test.project.App");
} catch (Exception e) {
e.printStackTrace();
}
しかし、期待通りにクラスパスを設定していません。その他の回避策?
あなたの第二の方法は、実際にどこにでもクラスパスを設定していません。最初のものについては、ファイルへのパスに空白が含まれていますか? – RealSkeptic
はありません。スペースはありません。 'compilerConfiguration.getClasspathEntries()'には141個のエントリがあります。私は2番目の方法で何かを逃していますか? – Disha
ええ、コマンドが別のJVMで実行されているため、現在のスレッドのクラスローダーとは関係がないという事実がなくなっています。 '-cp'(または' CLASSPATH'環境変数)を渡す必要があります。あなたは何とか 'classDir'で正確な文字列を共有できますか? – RealSkeptic