0

我正在尝试通过使用来自 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(Native Method) 错误 -- 在 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。程序将会退出。错误——线程“主”中的异常

这是我的代码。

    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;
      }
}
4

2 回答 2

1

“-classpath”参数或您尝试使用的 JAR 文件有问题。

  • 打印出“-classpath”参数的值,并检查 JAR 文件是否真的在文件系统中的那个位置,并且它是可读的。

  • 用于jar -tvf test.jar | grep ...检查 Main 类是否在 JAR 文件中,并且在 JAR 中具有正确的路径。

(问题不是清单……因为您没有使用“-jar”。)

(入口点方法的签名也不是问题main......因为这会导致不同的异常。)

于 2011-04-10T03:20:19.527 回答
0

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

那将是这样的:

Main-Class: com.test.Main

您可能需要查看Running JAR-Packaged Software 文档

于 2011-04-10T03:19:00.780 回答