Rust invoke java server через Maven в Windows без «Завершение партийного задания», когда остановленJAVA

Программисты JAVA общаются здесь
Anonymous
Rust invoke java server через Maven в Windows без «Завершение партийного задания», когда остановлен

Сообщение Anonymous »

Я пишу CLI в Rust, и я хочу, чтобы он работал на Windows или Linux. Я хочу, чтобы это вызвало Maven, чтобы запустить Java -программу. У меня уже есть эта работа в сценарии Bash, который я могу вызвать через Git Bash; Похоже, это: < /p>

Код: Выделить всё

execMainClass=${args[1]}
execArgs=("${args[@]:2}")
mvn exec:java -Dexec.mainClass="$execMainClass" -Dexec.args="${execArgs[*]@Q}" \
-Dexec.cleanupDaemonThreads=false --quiet
Программа Java, в свою очередь, запускает локальный сервер, который я должен прекратить использование Ctrl+C . Как только я это сделаю, управление сразу же возвращается в Git Bash. Я просто хочу воспроизвести все это в ржавчине, и из того, что я читаю, ничто не должно быть лучше, чем ржавчина, чтобы реализовать CLI, который взаимодействует с системой. Вот что эта документация говорит мне использовать: < /p>

Код: Выделить всё

return std::process::Command::new("cmd")
.args(["/C", "mvn", "exec:java"])
.arg(format!("-Dexec.mainClass={main_class}"))
.args(["-Dexec.cleanupDaemonThreads=false", "--quiet"])
.status();
< /code>
Когда я запускаю свою ржавчину, он действительно вызывает Maven, которая затем запускает мою программу Java, которая запускает локальный сервер! Однако, когда я нажимаю Ctrl+C < /code>, чтобы остановить локальный сервер, я получаю следующее сообщение: < /p>

Terminate batch job (Y/N)?
nope. Не хочу этого. Я подумал, что, может быть, это произойдет от Rust, вызывая CMD как -то. Поэтому я попытался призвать Maven напрямую в CLI Rust: < /p>

Код: Выделить всё

return std::process::Command::new("mvn")
.args(["exec:java"])
.arg(format!("-Dexec.mainClass={main_class}"))
.args(["-Dexec.cleanupDaemonThreads=false", "--quiet"])
.status();
< /code>
К сожалению, при запуске как в Git Bash, так и в PowerShell это приводит к: < /p>

Error: program not found
, который происходит из моего кода обработки ошибок в других местах в CLI:

Код: Выделить всё

Err(e) => {
eprintln!("Error: {}", e);
std::process::exit(exitcode::SOFTWARE);
}
Однако, основываясь на комментариях здесь, я понял, что Git Bash находит MVN на пути, но PowerShell обнаруживает вместо этого файл mvn.cmd на пути. Поскольку rust вообще обходит Git Bash, я изменил напрямую вызов mvn.cmd :

Код: Выделить всё

return std::process::Command::new("mvn.cmd")
.args(["exec:java"])
.arg(format!("-Dexec.mainClass={main_class}"))
.args(["-Dexec.cleanupDaemonThreads=false", "--quiet"])
.status();
< /code>
Это теперь работает Maven как в Git Bash, так и в PowerShell. Но после нажатия Ctrl+C < /code> в программе Java я все еще получаю: < /p>

Terminate batch job (Y/N)?
Еще хуже, в PowerShell это ставит оболочку в какое -то странное состояние, где он беспорядочно реагирует на клавиши и висит. это происходит независимо от того, использую ли я CMD/C MVN… или mvn.cmd… .
git bash, очевидно, может вызвать mvn.cmd и выйти с ctrl+c , не получая прекращения работы (y/n)? Какой трюк мне нужно потянуть, чтобы сделать это в ржавчине?

Подробнее здесь: https://stackoverflow.com/questions/796 ... -job-messa

Вернуться в «JAVA»