【问题标题】:The reason why java process started by Maven cannot be stopped by Ctrl+C on WindowsMaven启动的java进程在Windows上不能被Ctrl+C停止的原因
【发布时间】:2017-11-02 01:24:56
【问题描述】:

我创建了一个可执行的 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 -> 显示主页。

(3) 按Ctrl+C

(4) 访问http://localhost:8080 -> 仍然显示主页面(Tomcat 没有停止)。

【问题讨论】:

  • 它会打开一个与您执行的窗口分开的控制台窗口吗?如果是这样,请选择该控制台并按 CTRL+C 看看会发生什么...
  • 看起来你正在执行 maven 目标,它运行你正在构建的 jar。这有点奇怪。成功了吗?
  • 收件人:Jorge,No。在一个窗口上执行。
  • to:Amarnath,我想构建 jar 并使用一个命令运行它。不可能吗?
  • 请注意,对于 maven-surefire-plugin(“maven 测试”),类似问题已修复 as of version 2.19

标签: java maven tomcat


【解决方案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

但是,如果底层 Tomcat(或您正在使用的任何 servlet)已经从父 java 会话启动,它可能仍在运行。要有效地杀死所有(注意:所有)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 正在运行。

【讨论】:

  • It's litterally an overkill:说得好! :)
【解决方案2】:

停止所有作业:

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

【讨论】:

  • 我尝试了mvn tomcat7:shutdown,但 Tomcat 并没有停止。我还应该更改我的 pom.xml 吗?
  • 在 Windows 任务管理器中杀死进程 java。如果你能在 Linux 下关闭 Tomcat 服务器,相信在 Windows 下关闭 Tomcat 也是一样的。
  • 我知道任务管理器可以杀死进程但我不想使用它。
  • 如果可能的话,我想像Linux一样按ctrl+c关机。
  • 这方面有更新吗?我仍然有同样的问题。当我运行mvn clean test 时,我无法使用 Ctrl+C 停止它。
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 2016-05-28
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多