如何使用Java启动和停止Tomcat容器?

时间:2010-02-03 07:21:46

标签: java unit-testing tomcat maven-2 junit

我有一个Maven项目,它启动一个tomcat容器进行预集成测试(jUnit Tests)。我的大多数测试都要求重新启动测试中的Web应用程序。所以我想在执行每个jUnit测试之前重启Tomcat容器。

至于现在,我使用cargo-maven2-plugin来配置tomcat容器。

那么,是否可以使用java语句启动和停止容器?

4 个答案:

答案 0 :(得分:14)

  

那么,是否可以使用java语句启动和停止容器?

您的用例看起来非常奇怪(必须在测试之间重新启动容器)但是我们不讨论这个。要回答你的问题,是的,这是可能的,这可以使用Cargo的Java API来完成。

要启动Tomcat容器并部署战争,您可以在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();

并在tearDown()方法中停止。

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

答案 1 :(得分:5)

bootcatrap.jar和commons-logging-api-1.1.1从tomcat \ bin到你的类路径,下面的代码片段可能会有所帮助,

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

bootstrap.start();

Thread.sleep(60000);

bootstrap.stop();

答案 2 :(得分:2)

我正在使用以下方法:

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();
    }
}

但方法有一个问题 - 每次更改源代码时,我都需要在'webapps'目录中复制WAR文件。 我喜欢从web-inf中的classpath复制我的类,并从web-inf / lib中的classpath复制'jar'。

答案 3 :(得分:1)

是的。但我很无聊,你的测试需要多长时间。您必须修复测试以不依赖于服务器启动和关闭。可以在容器内运行测试,但容器应该在测试之前启动一次。

回答您的问题,您可以使用系统调用从Java执行相关的.sh.bat文件。如下所示,

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