我创建了一个可由 Maven 运行的可执行 Tomcat jar 应用程序 (mvn clean install exec:exec
)。在 Linux 上可以通过 Ctrl+C 停止此应用程序。但是,它不能在 Windows 上使用。有谁知道原因和解决办法吗?
环境:
$ mvn -version
Apache Maven 3.2.2 (45f7c06d68e745d05611f7fd14efb6594181933e; 2014-06-17T22:51:42+09:00)
Maven home: c:\apache-maven-3.2.2
Java version: 1.8.0_121, vendor: Oracle Corporation
Java home: c:\Program Files\Java\jdk1.8.0_121\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 7", version: "6.1", arch: "amd64", family: "dos"
pom.xml 摘录:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<id>tomcat-run</id>
<goals>
<goal>exec-war-only</goal>
</goals>
<phase>package</phase>
<configuration>
<path>/</path>
<enableNaming>true</enableNaming>
<finalName>embtest.jar</finalName>
<charset>utf-8</charset>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>ROOT</warName>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<id>startup-uber-tomcat</id>
<phase>install</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<classpathScope>test</classpathScope>
<executable>java</executable>
<arguments>
<argument>-jar</argument>
<argument>target/embtest.jar</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
重现步骤:
(1) 在 Windows 上运行命令:
$ git clone https://github.com/k-tamura/embtest.git
$ cd embtest
$ mvn clean install exec:exec
(2) 访问http://localhost:8080 -> 显示主页。
(3) 按Ctrl+C
(4) 访问http://localhost:8080 -> 主页仍然显示(Tomcat 没有停止)。
最佳答案
当您启动 mvn 时实际发生的是您在 bash 进程之外启动了一个 JVM 实例。输出被重定向到 bash。
要避免这种情况并保持对 bash shell 的控制,是通过添加 & 在后台启动进程
$ mvn clean install exec:exec&
在此之后,您将获得流程的输出。您可以通过发出 ps 在 Windows 上下文 (!) 中找到进程 PID
$ ps
PID PPID PGID WINPID TTY UID STIME COMMAND
1475 1474 1475 15204 pty0 197610 10:38:32 /usr/bin/bash
1666 1475 1666 18688 pty0 197610 10:54:48 /c/Program Files/AdoptOpenJDK/jdk-11.0.7.10-openj9/bin/java
1685 1475 1685 4524 pty0 197610 10:54:57 /usr/bin/ps
1474 1 1474 15544 ? 197610 10:38:32 /usr/bin/mintty
在这里您可以看到 Java 运行时的 Windows PID 是 18688。
现在,您可以通过使用 -f(强制)选项参数对其发出 taskkill 来终止该进程:
$ taskkill -pid 18688 -f
SUCCESS: The process with PID 18688 has been terminated.
[1]+ Exit 1 ./mvnw spring-boot:run
但是底层的 Tomcat(或您正在使用的任何 servlet)可能仍在运行,如果它是从父 java session 启动的。要有效地杀死所有(注意:所有)java 进程,请在具有 java.exe 镜像名称的进程上使用 -f 发出 taskkill:
taskkill -im "java.exe" -f
SUCCESS: The process "java.exe" with PID 14452 has been terminated.
SUCCESS: The process "java.exe" with PID 12380 has been terminated.
[1]+ Exit 1 ./mvnw spring-boot:run
这有点矫枉过正,但您确定没有任何 java 正在运行。
关于java - Maven启动的java进程在Windows上无法通过Ctrl+C停止的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44298331/