Исполняемый файл Powershell JAR занимает экземпляр - PullRequest
1 голос
/ 30 мая 2020

Я пытаюсь написать сценарий PowerShell для запуска моего Jar, который представляет собой простое приложение hello world spring web mvc с использованием сервлета tomcat catalina. Проблема в том, что после того, как я запустил свой Jar-файл, экземпляр PowerShell занят сервлетом. Это означает, что я не могу выполнить последовательную команду -> открыть chrome на локальном хосте: 8080.

Мой текущий сценарий PowerShell:

java -jar .\helloworld-0.0.1-SNAPSHOT.jar

# doesnt get executed due to the servlet occupation of the ps instance
Start-Process "chrome.exe" "http://localhost:8080" 

Есть ли способ запустить вторую команду в тот же экземпляр PowerShell, или мне нужно открыть еще один ps insance? А если, как мне это сделать?

1 Ответ

2 голосов
/ 30 мая 2020

Выполнение кода Java с java.exe запускает код синхронно , то есть в режиме блокировки . Следовательно, вызов Start-Process не достигается до тех пор, пока сервер не выключится, что, очевидно, не является намерением.

У вас есть два основных c варианта выполнения вызова асинхронный :

  • Используйте Start-Process для запуска команды в новом окне (только Windows):
# Opens the server in a *new window* (Windows only)
Start-Process java '-jar .\helloworld-0.0.1-SNAPSHOT.jar'
  • Используйте фоновое задание или задание потока (Start-Job или Start-ThreadJob [v6 +]), которое запускает команду в невидимом фоновом процессе или потоке, который вы можете контролировать и управлять с помощью командлетов *-Job:
# Start the server in a background process.
# In PowerShell [Core] 6+ you can use the lighter-weight Start-ThreadJob cmdlet.
# Monitor it with the *-Job cmdlets, such as Receive-Job.
$jb = Start-Job { java -jar .\helloworld-0.0.1-SNAPSHOT.jar }

# Syntactically simpler PowerShell [Core] v6+ alternative:
# (A postpositional & is the same as using Start-Job.
# As of PowerShell 7.0, there is no operator for Start-ThreadJob.)
$jb = java -jar .\helloworld-0.0.1-SNAPSHOT.jar &

Используйте Receive-Job $jb для получения вывода задания и Stop-Job $jb для его остановки (и, следовательно, сервера).

...