2010-02-03 20 views
10

Tengo un proyecto Maven que comienza un contenedor Tomcat para pre-integración-pruebas (pruebas JUnit). La mayoría de mis pruebas requieren que se reinicie la aplicación web bajo prueba. Así que me gustaría reiniciar el contenedor Tomcat antes de ejecutar cada prueba jUnit.¿Cómo iniciar y detener un contenedor Tomcat con Java?

En cuanto Ahora uso la carga-maven2-plugin para configurar el contenedor Tomcat.

Por lo tanto, es posible iniciar y detener el recipiente con una declaración de Java?

+1

¿Seguro que necesita para reiniciar el contenedor y no sólo a cargar la aplicación web? –

Respuesta

14

Por lo tanto, es es posible iniciar y detener el contenedor con una declaración java?

Su caso de uso se ve extremadamente extraño (tener que reiniciar el contenedor entre las pruebas) pero no discutamos esto. Para responder a su pregunta, sí, es posible y esto se puede hacer utilizando la API Java Cargo.

Para iniciar un contenedor Tomcat y desplegar su guerra, se puede hacer algo como esto en el método setUp():

// (1) Optional step to install the container from a URL pointing to its distribution 
Installer installer = new ZipURLInstaller(new URL("http://www.apache.org/dist/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.zip")); 
installer.install(); 

// (2) Create the Cargo Container instance wrapping our physical container 
LocalConfiguration configuration = (LocalConfiguration) new DefaultConfigurationFactory() 
     .createConfiguration("tomcat6x"), ContainerType.INSTALLED, ConfigurationType.STANDALONE); 
container = (InstalledLocalContainer) new DefaultContainerFactory() 
     .createContainer("tomcat6x", ContainerType.INSTALLED, configuration); 
container.setHome(installer.getHome()); 

// (3) Statically deploy some WAR (optional) 
WAR deployable = new WAR("./webapp-testing-webapp/target/webapp-testing-webapp-1.0.war"); 
deployable.setContext("ROOT"); 
configuration.addDeployable(deployable); 

// (4) Start the container 
container.start(); 

y detenerlo en el método tearDown().

// (6) Stop the container 
container.stop(); 
+0

Gracias, no pensé en Cargo para esto. –

+0

@Vinegar Es más habitual usar Cargo a través de complementos (al menos eso creo) pero Cargo * es * en realidad una API de Java antes que nada. Y esto puede ser útil (cada vez más contenedores ofrecen una API integrada, pero la API de Cargo está "unificada"). –

+0

Sí, tiendo a estar de acuerdo. Gracias. –

1

Sí, lo es. Pero tengo muchas preguntas, ¿cuánto tiempo tomarán tus exámenes? Debe corregir sus pruebas para no depender del inicio y el apagado del servidor. Es bueno ejecutar pruebas dentro del contenedor, pero el contenedor debe iniciarse una vez antes de las pruebas.

Bien para responder a su pregunta, puede ejecutar los archivos pertinentes .sh o .bat de Java utilizando las llamadas al sistema. Algo parecido a continuación,

Runtime r = Runtime.getRuntime(); 
Process p = r.exec("start.sh"); 
p.waitFor(); 
5

bootstrap.jar y commons-logging-api-1.1.1 del tomcat \ bin a la ruta de clase y el siguiente fragmento puede ayudar,

Bootstrap bootstrap=new Bootstrap(); 
bootstrap.setCatalinaHome("D:/apache-tomcat-5.5.28"); 

bootstrap.start(); 

Thread.sleep(60000); 

bootstrap.stop(); 
2

estoy usando el método de seguimiento:

private static final String TOMCAT = "D:/test_tomcat"; 
@BeforeClass 
public static void runTomcat() { 
    bootstrap = new Bootstrap(); 
    bootstrap.setCatalinaHome(TOMCAT); 
    try { 
     bootstrap.start();   
    } catch (Exception e) { 
     e.printStackTrace(); 
     fail("Не удалось запустить Tomcat"); 
    } 
} 

@AfterClass 
public static void stopTomcat() { 
    try { 
     bootstrap.stop(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Pero es un método tiene un problema - que necesito copiar el archivo WAR en el directorio 'webapps' cada vez que tenga el código fuente del cambio. Creo que copiar mi clase desde classpath en web-inf y copiar 'jar' desde classpath en web-inf/lib.

Cuestiones relacionadas