2011-04-10 40 views
0

我試圖通過使用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; 
     } 
} 
+0

看來,你的類路徑中不包含在問題類。你確定動態生成的類路徑是正確的嗎?我的意思是,你能檢查test.jar文件嗎? – 2011-04-10 03:19:29

+0

是的。如果我使用批處理文件運行該命令,它可以工作。 – gmtosh 2011-04-10 03:27:41

+0

我在你的批處理文件中打賭你不會動態生成test.jar文件的路徑。對?如果您在批處理文件中使用絕對路徑並且它可以正常工作,則它只能表示您在代碼中生成的絕對路徑不相同。你不覺得嗎? – 2011-04-10 03:39:03

回答

0

您是否在jar的清單文件中設置了Main-Class值?

這將是這樣的:

Main-Class: com.test.Main 

您可能要審查Running JAR-Packaged Software documentation

+0

我不認爲這是問題,因爲在命令行調用中提供了包含main方法的類的路徑。 – 2011-04-10 03:21:32

+1

不是。他沒有使用「-jar」,所以清單條目不相關。 – 2011-04-10 03:22:00

+0

但是,儘管.jar不是一個自動運行的jar類型,但它仍然會嘗試運行的.class(它有一個主要方法)在.jar中。 – djangofan 2011-06-22 05:10:44

1

也有一些是錯誤類型爲「-classpath」的說法,或者你要使用的JAR文件。

  • 打印出來的「-classpath」參數的值,並檢查JAR文件確實是在文件系統中的位置,而且它是可讀的。

  • 使用jar -tvf test.jar | grep ...檢查Main類是否在JAR文件中,並且在JAR中有正確的路徑。

(這是因爲您沒有使用「罐子」是不是清單這是問題...。)

(這也是未與main入口點方法的簽名的問題。 ..因爲這將導致不同的例外)。

+0

您也可以使用該路徑創建一個File對象,並詢問該文件是否存在並在Tomcat日誌中記錄某些內容或調試該代碼。 – 2011-04-10 03:29:42

相關問題