Я пытаюсь выполнить метод Main внутри класса в файле jar, используя Java ProcessBuilder из сервлета.Мне нужно запустить это в отдельном процессе из-за других зависимостей.
Я получаю следующее исключение, поэтому я предполагаю, что неправильно передаю пакет и имя метода Main (com.test.Main)в массиве аргументов.Я не уверен, как это сделать правильно.
Буду признателен за любые предложения.Спасибо.
ОШИБКА - java.lang.NoClassDefFoundError: com / test / Main ERROR - Причина: java.lang.ClassNotFoundException: com.test.Main ERROR - на 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;
}
}