在Windows上,Ctrl + C无法停止Maven启动Java进程的原因

时间:2017-06-01 04:00:58

标签: java maven tomcat

我创建了一个可执行的Tomcat jar应用程序,可以由Maven(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 - &gt;显示主页面。

(3)按 Ctrl + C

(4)访问http://localhost:8080 - &gt;主页面仍然显示(Tomcat未停止)。

2 个答案:

答案 0 :(得分:1)

启动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

但是,如果已从父Java会话启动了基础Tomcat(或您正在使用的任何servlet),则它可能仍在运行。要有效地杀死所有(注意:ALL)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都不再运行了。

答案 1 :(得分:0)

停止所有工作:

mvn tomcat7:shutdown

使用组合键 Ctrl + C 时,仍然有效。

<强>参考:

http://tomcat.apache.org/maven-plugin-2.2/tomcat7-maven-plugin/plugin-info.html

http://tomcat.apache.org/maven-plugin-2.2/tomcat7-maven-plugin/shutdown-mojo.html