Исключение класса не найдено при попытке выполнить приложение Java с ProcessBuilder - PullRequest
0 голосов
/ 10 апреля 2011

Я пытаюсь выполнить метод Main внутри класса в файле jar, используя Java ProcessBuilder из сервлета.Мне нужно запустить это в отдельном процессе из-за других зависимостей.

Я получаю следующее исключение, поэтому я предполагаю, что неправильно передаю пакет и имя метода Main (com.test.Main)в массиве аргументов.Я не уверен, как это сделать правильно.

Буду признателен за любые предложения.Спасибо.

ОШИБКА - java.lang.NoClassDefFoundError: com / test / Main ERROR - Причина: java.lang.ClassNotFoundException: com.test.Main ERROR - на java.net.URLClassLoader $ 1.run (URLClassLoader.java:202) ОШИБКА - в java.security.AccessController.doPrivileged (собственный метод) ОШИБКА - в 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.Программа будет закрыта.ОШИБКА - Исключение в потоке "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 голос
/ 10 апреля 2011

Что-то не так с аргументом "-classpath" или файлом JAR, который вы пытаетесь использовать.

  • Распечатайте значение аргумента "-classpath" и убедитесь, что файл JAR действительно находится в этом месте файловой системы и доступен для чтения.1006 *

  • Используйте jar -tvf test.jar | grep ..., чтобы проверить, что класс Main находится в файле JAR и имеет правильный путь в JAR.Это проявление проблемы ... потому что вы не используете "-jar".)

    (Это также не проблема с сигнатурой main метода точки входа ..., потому что это привело бы кдругое исключение.)

0 голосов
/ 10 апреля 2011

Вы установили значение Main-Class в файле манифеста вашей банки?

Это будет примерно так:

Main-Class: com.test.Main

Возможно, вы захотите просмотреть Running JAR-Документация по пакетному программному обеспечению .

...