2013-04-22 7 views
7

Używam Maven Jetty Plugin, czy istnieje sposób, aby uniemożliwić uruchomienie lub wyłączenie serwera (na przykład z wtyczką maven-jetty), jeśli KAŻDEJ fasoli nie powiedzie się ?Jak anulować start lub zamknięcie pomostu, jeśli nie udało się uruchomić WebAppContext

Oto przykład:

2013-04-22 11:43:59.327:WARN:oejw.WebAppContext:main: Failed startup of context [email protected]{/,file:/opt/bamboo/bamboo-home/xml-data/build-dir/APA-BC-JETTYAPA/src/main/webapp/,STARTING}{file:/opt/bamboo/bamboo-home/xml-data/build-dir/APA-BC-JETTYAPA/src/main/webapp/} 
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/classes/applicationContext.xml]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'staticDataService' for bean class [com.etermax.common.service.StaticDataService] conflicts with existing, non-compatible bean definition of same name and class [com.etermax.bingo.api.service.BingoStaticDataService] 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:412) 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334) 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) 
     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174) 
     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209) 
     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180) 
     at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124) 
     at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:93) 
     at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) 
     at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451) 
     at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:272) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:196) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) 
     at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:778) 
     at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:425) 
     at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:770) 
     at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:275) 
     at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1312) 
     at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:722) 
     at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:490) 
     at org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:275) 
     at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69) 
     at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:108) 
     at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:90) 
     at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:58) 
     at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:175) 
     at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69) 
     at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:108) 
     at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:90) 
     at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:58) 
     at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69) 
     at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:108) 
     at org.eclipse.jetty.server.Server.start(Server.java:346) 
     at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:90) 
     at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:58) 
     at org.eclipse.jetty.server.Server.doStart(Server.java:294) 
     at org.eclipse.jetty.maven.plugin.JettyServer.doStart(JettyServer.java:78) 
     at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69) 
     at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:537) 
     at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:352) 
     at org.eclipse.jetty.maven.plugin.JettyRunMojo.execute(JettyRunMojo.java:167) 
     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320) 
     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) 
     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
     at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
     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:601) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 
Caused by: 
org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'staticDataService' for bean class [com.etermax.common.service.StaticDataService] conflicts with existing, non-compatible bean definition of same name and class [com.etermax.bingo.api.service.BingoStaticDataService] 
     at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:312) 
     at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:253) 
     at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84) 
     at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73) 
     at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438) 
     at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428) 
     at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:184) 
     at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:140) 
     at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:111) 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493) 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334) 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) 
     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174) 
     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209) 
     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180) 
     at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124) 
     at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:93) 
     at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) 
     at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451) 
     at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:272) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:196) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) 
     at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:778) 
     at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:425) 
     at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:770) 
     at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:275) 
     at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1312) 
     at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:722) 
     at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:490) 
     at org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:275) 
     at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69) 
     at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:108) 
     at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:90) 
     at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:58) 
     at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:175) 
     at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69) 
     at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:108) 
     at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:90) 
     at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:58) 
     at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69) 
     at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:108) 
     at org.eclipse.jetty.server.Server.start(Server.java:346) 
     at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:90) 
     at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:58) 
     at org.eclipse.jetty.server.Server.doStart(Server.java:294) 
     at org.eclipse.jetty.maven.plugin.JettyServer.doStart(JettyServer.java:78) 
     at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69) 
     at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:537) 
     at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:352) 
     at org.eclipse.jetty.maven.plugin.JettyRunMojo.execute(JettyRunMojo.java:167) 
     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320) 
     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) 
     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
     at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
     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:601) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 
2013-04-22 11:43:59.349:INFO:oejs.ServerConnector:main: Started [email protected]{HTTP/1.1}{0.0.0.0:8083} 

Chciałbym serwer do wyłączenia. Wiem, że istnieje sposób, który obejmuje kodowanie metody destroy w każdym komponencie bean, ale chciałbym coś globalnego dla dowolnego komponentu bean.

+0

Czy korzystasz z osadzonego pomostu? – quintin

Odpowiedz

11

Nie było łatwo to osiągnąć. Potrzeba było kilku godzin ciężkiej pracy, aby znaleźć wymagane informacje z kodu źródłowego jetty.

Oto rozwiązanie, które działało z moją prostą aplikacją testową, która rzuciła ServletException na metodę init HttpServlet. Kluczem do sukcesu jest ustawienie właściwości startWithUnavailable ServletHandler na false.

pom.xml:

<plugin> 
    <groupId>org.mortbay.jetty</groupId> 
    <artifactId>jetty-maven-plugin</artifactId> 
    <version>8.1.10.v20130312</version> 
    <configuration> 
     <contextXml>src/main/resources/context.xml</contextXml> 
     <webAppConfig> 
      <throwUnavailableOnStartupException>true</throwUnavailableOnStartupException> 
     </webAppConfig> 
    </configuration> 
</plugin> 

context.xml:

<?xml version="1.0"?> 
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd"> 
<Configure> 
    <Set name="throwUnavailableOnStartupException">true</Set> 
    <Set name="servletHandler"> 
     <New class="org.eclipse.jetty.servlet.ServletHandler"> 
      <Set name="startWithUnavailable">false</Set> 
     </New> 
    </Set> 
</Configure> 

TestServlet.java:

public class TestServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    @Override 
    public void init() throws ServletException { 
     super.init(); 
     throw new ServletException("FAIL!"); 
    } 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
    } 
} 
+0

Sami, jesteś geniuszem! Wielkie dzięki! Nigdy nie sprawdziłby kodu źródłowego pomostu dla tej opcji. – Gonzalo

+1

Jeśli ktoś natknie się na tę bardzo użyteczną odpowiedź, nieco lepszą wersją jest wyciągnięcie istniejącej procedury obsługi serwletu i ustawienie na niej właściwości: false brendanh

+0

Czy to rozwiązanie działa w przypadku wielu aplikacji internetowych? – quintin

0

Można sprawdzić org.mortbay.jetty.webapp.WebAppContext.getUnavailableException() metodę po org.mortbay.component.AbstractLifeCycle.start() zwrócone. Jeśli nie jest pusta, w inicjacji WebAppContext został zgłoszony wyjątek.

Powiązane problemy