我正在尝试使用来自servlet的Java的ProcessBuilder在jar文件中的类中执行Main方法。由于其他依赖性,我需要在一个单独的进程中运行它。
我收到以下异常,所以我猜我没有在arguments数组中正确传递包和Main方法名(com.test.Main)。我不确定如何正确地做到这一点。
我很感激任何建议。感谢。
错误 - java.lang.NoClassDefFoundError:com / test / Main 错误 - 引起:java.lang.ClassNotFoundException:com.test.Main 错误 - 在java.net.URLClassLoader $ 1.run(URLClassLoader.java:202) 错误 - 在java.security.AccessController.doPrivileged(本机方法) 错误 - 在java.net.URLClassLoader.findClass(URLClassLoader.java:190) 错误 - 在java.lang.ClassLoader.loadClass(ClassLoader.java:307) 错误 - 在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301)
错误 - 在java.lang.ClassLoader.loadClass(ClassLoader.java:248) 错误 - 找不到主类:com.test.Main。程序将会退出。 错误 - 线程“main”中的异常
这是我的代码。
public int runProcessBuilder() throws IOException, InterruptedException{
{
// Get absolute path
File dir_location = new File(".");
String appPath = dir_location.getCanonicalPath() + "\\Tomcat 6.0\\webapps\\TestServer\\WEB-INF";
// Args to run
String[] argList = {"java.exe","-Djava.library.path="+appPath+"\\lib","-classpath",appPath+"\\lib\\test.jar","com.test.Main","-pTEST_ARG","123"};
// Create ProcessBuilder
ProcessBuilder builder = new ProcessBuilder(argList);
// Set Environment variable(s)
Map<String, String> environ = builder.environment();
environ.put("TEST_HOME", appPath);
// Set java directory - TODO: use system property
String java_exe = "C:\\Program Files\\Java\\jdk1.6.0_18\\bin";
builder.directory(new File(java_exe));
// Start Process
final Process process = builder.start();
// Read error stream
StreamReader errorReader = new StreamReader(process
.getErrorStream(), "ERROR");
// Read input stream
StreamReader outputReader = new StreamReader(process
.getInputStream(), "OUTPUT");
// Start both reader threads
errorReader.start();
outputReader.start();
// Wait for process end and get Exit Code
int exitCode = process.waitFor();
System.out.println("Exit code: " + exitCode);
return exitCode;
}
}
答案 0 :(得分:1)
“-classpath”参数或您尝试使用的JAR文件有问题。
打印出“-classpath”参数的值,并检查JAR文件是否确实位于文件系统中的该位置,并且它是可读的。
使用jar -tvf test.jar | grep ...
检查Main类是否在JAR文件中,并且在JAR中具有正确的路径。
(问题不在于清单......因为你没有使用“-jar”。)
(main
入口点方法的签名也不是问题......因为这会导致不同的异常。)
答案 1 :(得分:0)
您是否在jar的清单文件中设置了Main-Class值?
这就像是:
Main-Class: com.test.Main