【发布时间】:2016-09-08 06:51:48
【问题描述】:
我想从我当前的 java 项目中执行一个 java 程序。它有多个 jar 依赖项,应该在执行它之前添加到类路径中。首先,我尝试使用普通的 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();
}
但它没有按预期设置类路径。还有其他解决方法吗?
【问题讨论】:
-
您的第二种方法实际上并没有在任何地方设置类路径。至于第一个 - 文件的任何路径是否包含空格?
-
no.. 没有空格.. 'compilerConfiguration.getClasspathEntries()' 中有大约 141 个条目。我在第二种方法中遗漏了什么吗?
-
是的,您错过了命令在单独的 JVM 中运行的事实,因此与当前线程的类加载器无关。您必须传递
-cp(或CLASSPATH环境变量)。你能以某种方式分享classDir中的确切字符串吗? -
嗯。它似乎有很多特殊字符。您是否尝试将其放在命令中的双引号内?
-
你检查过这个问题吗:stackoverflow.com/questions/201816/…?