我試圖通過使用Java的的ProcessBuilder從servlet在一個jar文件類中執行的主要方法時,未發現異常。由於其他依賴關係,我需要在單獨的進程中運行它。類試圖執行一個Java應用程序的ProcessBuilder
我得到以下異常,所以我想,我沒有正確地傳遞包裹和主要方法名(com.test.Main)的參數數組英寸我不知道如何正確地做到這一點。
我會很感激任何建議。謝謝。
ERROR -- java.lang.NoClassDefFoundError: com/test/Main ERROR -- Caused by: java.lang.ClassNotFoundException: com.test.Main ERROR -- at java.net.URLClassLoader$1.run(URLClassLoader.java:202) ERROR -- at java.security.AccessController.doPrivileged(Native Method) ERROR -- at java.net.URLClassLoader.findClass(URLClassLoader.java:190) ERROR -- at java.lang.ClassLoader.loadClass(ClassLoader.java:307) ERROR -- at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
ERROR -- at java.lang.ClassLoader.loadClass(ClassLoader.java:248) ERROR -- Could not find the main class: com.test.Main. Program will exit. ERROR -- Exception in thread "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;
}
}
看來,你的類路徑中不包含在問題類。你確定動態生成的類路徑是正確的嗎?我的意思是,你能檢查test.jar文件嗎? – 2011-04-10 03:19:29
是的。如果我使用批處理文件運行該命令,它可以工作。 – gmtosh 2011-04-10 03:27:41
我在你的批處理文件中打賭你不會動態生成test.jar文件的路徑。對?如果您在批處理文件中使用絕對路徑並且它可以正常工作,則它只能表示您在代碼中生成的絕對路徑不相同。你不覺得嗎? – 2011-04-10 03:39:03