java - Maven启动的java进程在Windows上无法通过Ctrl+C停止的原因

标签 java maven tomcat

我创建了一个可由 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/

相关文章:

java - 滚动条上的 Jquery 下划线

java - Double 数据类型不返回十进制值 (Java)

java - 如何在我的 Java 应用程序中设置 JVM 时间(不是操作系统时间)?

Maven 通过构建,最多 X 次测试失败

tomcat - t 找到基本名称 org.eclipse.persistence.exceptions.i18n.PersistenceUnitLoadingExceptionResource 的包,语言环境 en_US

maven - spectj-maven-编译器插件 : how to weave JRE System. *?

java - 如何运行 Sonar 来分别分析每个子模块

java - 如何添加对另一个模块的运行时依赖?

java - Docker 是否在 VM 之上提供任何内存效率?

tomcat - 为什么在 RedHat 上默认安装的 Tomcat 会在整个文件系统中 split 目录?