为什么我不能closures从maven插件embedded的tomcat 7?

我正在使用tomcat7-maven-plugin 2.2从命令行运行一个webapp(我在Windows 8.1,Java 1.7.0_51和Maven 3.2.1上)。

这是configuration(很简单,我猜):

 <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <address>localhost</address> <port>8080</port> <path>/</path> <uriEncoding>UTF-8</uriEncoding> </configuration> </plugin> 

我使用mvn tomcat7:run运行Maven mvn tomcat7:run并正确启动,服务器启动, mvn tomcat7:run应用程序加载,我可以与之交互。
我运行Maven的命令提示符正忙于显示Tomcat输出(对我来说这看起来很好):

 [INFO] Scanning for projects... [INFO] [INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder with a thread count of 1 [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building <project-name-here> 0.3 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] >>> tomcat7-maven-plugin:2.2:run (default-cli) @ <project-name-here> >>> [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ <project-name-here> --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 25 resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ <project-name-here> --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] <<< tomcat7-maven-plugin:2.2:run (default-cli) @ <project-name-here> <<< [INFO] [INFO] --- tomcat7-maven-plugin:2.2:run (default-cli) @ <project-name-here> --- [INFO] Running war on http://localhost:8080/ [INFO] Using existing Tomcat server configuration at c:\workspace\<project-name-here>\target\tomcat [INFO] create webapp with contextPath: apr 01, 2014 10:39:50 AM org.apache.coyote.AbstractProtocol init Informazioni: Initializing ProtocolHandler ["http-bio-127.0.0.1-8080"] apr 01, 2014 10:39:50 AM org.apache.catalina.core.StandardService startInternal Informazioni: Starting service Tomcat apr 01, 2014 10:39:50 AM org.apache.catalina.core.StandardEngine startInternal Informazioni: Starting Servlet Engine: Apache Tomcat/7.0.47 apr 01, 2014 10:39:52 AM org.apache.coyote.AbstractProtocol start Informazioni: Starting ProtocolHandler ["http-bio-127.0.0.1-8080"] 

然后,我想closures服务器:我运行mvn tomcat7:shutdown从一个单独的命令提示符,但我得到的是这样的:

 [INFO] Scanning for projects... [INFO] [INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder with a thread count of 1 [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building <project-name-here> 0.3 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- tomcat7-maven-plugin:2.2:shutdown (default-cli) @ <project-name-here> --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.083 s [INFO] Finished at: 2014-04-01T10:39:59+01:00 [INFO] Final Memory: 9M/154M [INFO] ------------------------------------------------------------------------ "cmd" non è riconosciuto come comando interno o esterno, un programma eseguibile o un file batch. 

最后一行是:

“cmd”不是公认的内部或外部命令,可执行文件或batch file。

我可以阻止Tomcat从第一个命令提示符击中Ctrl+C ,但由于我需要通过所有这些其他人,我想为他们提供一个脚本来启动webapp和一个脚本来阻止它。

怎么了? 这是一个插件错误? 这是我的configuration错误吗?


编辑

如果我将<fork>true</fork>到POM,则服务器将崩溃,并显示以下错误:

 [...] Informazioni: Starting service Tomcat apr 03, 2014 2:05:29 PM org.apache.catalina.core.StandardEngine startInternal Informazioni: Starting Servlet Engine: Apache Tomcat/7.0.47 apr 03, 2014 2:05:31 PM org.apache.coyote.AbstractProtocol start Informazioni: Starting ProtocolHandler ["http-bio-127.0.0.1-8080"] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 5.711 s [INFO] Finished at: 2014-04-03T14:05:31+01:00 [INFO] Final Memory: 26M/368M [INFO] ------------------------------------------------------------------------ ERROR: IllegalAccessException for stop method in class org.apache.tomcat.maven.plugin.tomcat7.run.ExtendedTomcat java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.tomcat.maven.common.run.EmbeddedRegistry.shutdownAll(EmbeddedRegistry.java:110) at org.apache.tomcat.maven.common.run.EmbeddedRegistry$1.run(EmbeddedRegistry.java:69) Caused by: org.apache.catalina.LifecycleException: Failed to stop component [StandardServer[-1]] at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:236) at org.apache.catalina.startup.Tomcat.stop(Tomcat.java:351) ... 6 more Caused by: org.apache.catalina.LifecycleException: Failed to stop component [StandardService[Tomcat]] at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:236) at org.apache.catalina.core.StandardServer.stopInternal(StandardServer.java:753) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232) ... 7 more Caused by: org.apache.catalina.LifecycleException: Failed to stop component [StandardEngine[Tomcat]] at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:236) at org.apache.catalina.core.StandardService.stopInternal(StandardService.java:502) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232) ... 9 more Caused by: java.lang.NoClassDefFoundError: org/apache/catalina/core/ContainerBase$StopChild at org.apache.catalina.core.ContainerBase.stopInternal(ContainerBase.java:1173) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232) ... 11 more Caused by: java.lang.ClassNotFoundException: org.apache.catalina.core.ContainerBase$StopChild at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50) at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:259) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:235) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:227) ... 13 more 

据我所知,在启动Tomcat服务器之后,需要使用Ctrl + c启动mvn tomcat7:run时关闭,因为它连接到当前的Maven运行。

关闭目标被用来在例如执行一些测试(集成测试)之后被调用来以完整的方式完成所有的工作。

看看叉选项http://tomcat.apache.org/maven-plugin-2.2/tomcat7-maven-plugin/run-mojo.html#fork

所以用这个选项你可以启动嵌入的tomcat运行一些测试然后关闭。

HTH

另一种方法是,如果Tomcat maven插件有一个启用关闭端口的方法(默认为8005),那么您可以发送默认的关闭字符串(默认“关闭”)来关闭它。

使用JMX客户端时,当我运行插件运行目标时,关闭端口被设置为-1。