我创建了一个可执行的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未停止)。
答案 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