有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

尝试使用ProcessBuilder执行Java应用程序时,类未找到异常

我试图通过从servlet使用Java的ProcessBuilder在jar文件的类中执行Main方法。由于其他依赖关系,我需要在单独的进程中运行此操作

我得到了以下异常,因此我猜我没有正确地在arguments数组中传递包和主方法名(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;
      }
}

共 (2) 个答案

  1. # 2 楼答案

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

    • 打印出“-classpath”参数的值,并检查JAR文件是否确实位于文件系统中的该位置,以及它是否可读

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

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

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