我还想改善持续交付。我使用一个Tomcat 8和Maven。
我用mvn tomcat:redeploy
部署web应用程序。
在tomcat documentation我发现这个部分:
部署新的应用程序归档(WAR)远程
如果安装和启动成功后,您会收到(...)
否则,响应将开始与失败,包括错误消息。
作为FAIL
可能的原因有一点是兴趣:
例外遇到试图启动新的Web应用程序。
所以,我还想在启动时抛出一个异常,所以在web.xml
我写的:
<负载上启动> 1 </负载上启动>
到org.springframework.web.servlet.DispatcherServlet
小服务程序。然后,我写一个Singleton:
@Service
public class AvoidStartupOnMissingDatabase implements SmartInitializingSingleton {
@Override
public void afterSingletonsInstantiated() {
throw new RuntimeException("Do not deploy this app!");
}
}
这将导致该堆栈跟踪:
java.lang.RuntimeException: Do not deploy this app!
at xxx.AvoidStartupOnMissingDatabase.afterSingletonsInstantiated(AvoidStartupOnMissingDatabase.java:11)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:775)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:664)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:630)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:678)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:549)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:490)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1144)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1091)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:983)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4962)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5274)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3823)
at org.apache.catalina.startup.HostConfig.reload(HostConfig.java:1410)
at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1320)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1648)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1525)
at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:773)
at org.apache.catalina.manager.ManagerServlet.doPut(ManagerServlet.java:443)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:664)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:613)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:486)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
应用程序部署的不幸!
我不初始化。我说时加载的启动。 Tomcat的说,如果没有启动失败。 Tomcat的说,(重新)部署,如果能启动。
所以异常必须失败的部署。对?
我测试的tomcat-30年5月8日和Tomcat的8.5.37,遗憾的是都成功。
四,创造了一个bug in Tomcat。开发人员引导我到类似亚历Cojocaru解决方案。
我从Servlet转移到SerlvetContextListener,我成功地接收到“失败”的部署。
这种无效的部署后,旧的应用程序是不幸的是没有重新启动。但承诺SVN成功取消,并不会添加到SVN改变日志!
Tomcat有两种选择来部署war文件:
更多细节和配置在该answer
此外,tomcat的:重新部署不回滚的目的,只是为了部署,而无需再次必要性或包装现有的战争。
我敢肯定的是,mvn tomcat:deploy
插件使用/经理/文本/ tomcat的部署端点部署war文件。
假设你使用的是一些持续集成服务器(詹金斯,特拉维斯等),或者只是一个简单的shell脚本来调用前面的步骤,我建议你这些方法执行回滚:
在你的流量,称为添加一个新的输入参数:rollback_tag或previous_version。
Maven是用于编译的最佳选择,产生战争或jar文件。但对于部署的目的,我觉得这是不是最好的选择。我不希望共享凭据或配置在我的pom.xml(带或不带变量):
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<url>http://localhost:8080/manager/text</url>
<server>TomcatServer</server>
<path>/javaCodeGeeks</path>
</configuration>
</plugin>
无论如何,如果你想使用Maven,您需要:
步骤可以是:
有了这个工具,我们需要使用SVN,只是一个时间来下载源代码。编译和部署成功后,你必须上传与特定的版本就像你流1.0.0下一步的战争或jar文件只需要下载战争/ jar文件。
在1.0.1部署错误的情况下,你只需要从您的神器库下载以前的稳定版本1.0.0。步骤可以是:
部署是成功的。您看到的堆栈跟踪是通过应用程序运行时错误,当春天试图加载AvoidStartupOnMissingDatabase
豆引起的。在这一点上,应用程序已经部署和运行。
如果你想Maven的redeploy
目标失败,你需要在部署过程中造成的错误,而不是在应用程序运行。您可以通过使用Maven的Tomcat插件配置的wrong URL,例如做到这一点。