2011-04-10 86 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