Rust Invoke Java Server über Maven unter Windows ohne "Batch -Job" -Meldung, wenn sie gestoppt werden
Posted: 22 May 2025, 22:42
Ich schreibe eine CLI in Rost und möchte, dass sie unter Windows oder Linux funktioniert. Ich möchte, dass es Maven aufruft, um ein Java -Programm durchzuführen. Ich habe bereits in einem Bash -Skript gearbeitet, das ich über Git Bash aufrufen kann. Es sieht so aus: < /p>
Das Java -Programm startet wiederum einen lokalen Server, den ich mit Strg+C aufhören muss. Sobald ich das tue, geht die Kontrolle sofort zurück zu Git Bash. Ich möchte nur das alles in Rost reproduzieren, und nach dem, was ich lese, sollte nichts besser sein als Rost, um eine CLI zu implementieren, die mit dem System interagiert. Hier ist, was die Dokumentation verwendet, um zu verwenden: < /p>
nope. Will das nicht. Ich dachte vielleicht, dass es aus Rost kommt, das irgendwie CMD aufruft. Also habe ich versucht, Maven direkt in die Rost-Cli aufzurufen: < /p>
, der aus meinem Fehlerhandling-Code an anderer Stelle in der CLI stammt:
Basierend auf den Kommentaren hier wurde mir klar, dass Git Bash MVN auf dem Pfad findet, aber PowerShell findet stattdessen die Datei mvn.cmd Datei auf dem Pfad. Da Rost Git Bash insgesamt Nebenbeschwerden hat, habe ich mich so geändert, dass ich Mvn.cmd :
direkt aufgerufen habe
Noch schlimmer, in PowerShell bringt die Shell in einen seltsamen Zustand, in dem sie unregelmäßig auf Tastenanschläge und Hänge reagiert. Dies passiert, ob ich CMD/C MVN verwende… oder mvn.cmd… . Welchen Trick muss ich ziehen, um dies in Rost zu erreichen?
Code: Select all
execMainClass=${args[1]}
execArgs=("${args[@]:2}")
mvn exec:java -Dexec.mainClass="$execMainClass" -Dexec.args="${execArgs[*]@Q}" \
-Dexec.cleanupDaemonThreads=false --quiet
Code: Select all
return std::process::Command::new("cmd")
.args(["/C", "mvn", "exec:java"])
.arg(format!("-Dexec.mainClass={main_class}"))
.args(["-Dexec.cleanupDaemonThreads=false", "--quiet"])
.status();
< /code>
Wenn ich meine Rust -Cli ausführe, ruft es tatsächlich Maven auf, das dann mein Java -Programm ausführt, das einen lokalen Server startet! Wenn ich jedoch Strg+C < /code> drücke, um den lokalen Server zu stoppen, erhalte ich die folgende Nachricht: < /p>
Terminate batch job (Y/N)?
Code: Select all
return std::process::Command::new("mvn")
.args(["exec:java"])
.arg(format!("-Dexec.mainClass={main_class}"))
.args(["-Dexec.cleanupDaemonThreads=false", "--quiet"])
.status();
< /code>
Leider ergibtError: program not found
Code: Select all
Err(e) => {
eprintln!("Error: {}", e);
std::process::exit(exitcode::SOFTWARE);
}
direkt aufgerufen habe
Code: Select all
return std::process::Command::new("mvn.cmd")
.args(["exec:java"])
.arg(format!("-Dexec.mainClass={main_class}"))
.args(["-Dexec.cleanupDaemonThreads=false", "--quiet"])
.status();
< /code>
Dadurch wird Maven sowohl in Git Bash als auch in PowerShell ausgeführt. Aber nachdem ich im Java -Programm Strg+C < /code> getroffen habe, bekomme ich immer noch: < /p>
Terminate batch job (Y/N)?