Запуск Java основного класса с использованием ProcessBuilder - PullRequest
0 голосов
/ 25 февраля 2020

Несколько месяцев go Я создал небольшой плагин Gradle, который запускал приложение Java на заднем плане. Хотя в прошлом это работало нормально, это уже не так, и я озадачен, почему это не так.

Кажется, что программа запуска работает нормально под Windows, но не работает с тем же при Linux , Когда он пытается выполнить команду, о которой идет речь, это:

/home/aris.kourtesas/.sdkman/candidates/java/8.0.242.hs-adpt/jre/bin/java -cp "/home/aris.kourtesas/Projects/marketing-server/classes:/home/aris.kourtesas/Projects/marketing-server/classes/*" -XX:+UseParallelGC -Dads.net.port=17770 -Dads.db.user=marketing_int -Dads.db.pwd=marketing_int -Dads.marketing fts.marketing.server.WebServer 

Сбой из-за следующей ошибки:

Error: Could not find or load main class fts.marketing.server.WebServer

Однако при копировании вставьте Команда и запустить его на оболочке напрямую, он работает просто отлично. Я очень смущен и, честно говоря, я не знаю, что мне делать Все файлы присутствуют, и путь к классам правильный, но он говорит, что основной класс, который я пытаюсь вызвать, не найден.

Для ссылки это код, который создает команду запуска:

if (isWindows()) {
        builder.append("CMD /C START /B ")
    }

    builder.append(java() + " -cp " + classpath() +
            " -XX:+UseParallelGC " +
            "-Dads.net.port=${MARKETING_IT_APPSERVER_PORT} " +
            "-Dads.db.user=${MARKETING_IT_DB_USERNAME} " +
            "-Dads.db.pwd=${MARKETING_IT_DB_PASSWORD} " +
            "-Dads.marketing " +
            (MARKETING_IT_DB_HOST ? "-Dads.db.host=${MARKETING_IT_DB_HOST} " : '') +
            (MARKETING_IT_USER_HOME ? "-Duser.home=${MARKETING_IT_USER_HOME} " : '') +
            "fts.marketing.server.WebServer")
    if (!isWindows()) {
        builder.append(" &")
    }

И это та часть кода, которая создает и запускает рассматриваемый процесс:

private def static createProcess(String directory, String command) {
       new ProcessBuilder(command.split(' '))
                .redirectErrorStream(true)
                .directory(Paths.get(directory).toFile())
                .start()
    }

Не могли бы вы пролить свет на это?

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Причина , наиболее вероятно, - это пробелы в созданной вами команде в месте, которое вы не контролируете (например, имена пользователей / имена пользователей / пароли) (зарегистрируйте вашу команду после разделения и посмотрите, что произошло).

Разделение на пустое пространство - такой подход fr agile, вы не должны никогда использовать его. Использование списка строк в первую очередь - путь к go. Либо используйте ["sh -c", "all your shelisms work here, even &"] - либо используйте [java() , '-cp', classpath(), ...] (без кавычек, без экранирования, ... здесь необходимо (только для ваших groovy строк))

0 голосов
/ 27 февраля 2020

Закрытие, так как проблема была решена. По какой-то причине цитирование classpath приводило к сбою команды при попытке запуска в Linux.

Удалена цитата из пути к классам (условно для Linux), и проблема была решена.

...