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

Posted

技术标签:

【中文标题】如何使用 Java 启动和停止 Tomcat 容器?【英文标题】:How to start and stop an Tomcat container with Java? 【发布时间】:2011-01-12 12:22:18 【问题描述】:

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

目前我使用cargo-maven2-plugin来配置tomcat容器。

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

【问题讨论】:

您确定需要重启容器而不是重新加载 webapp? 【参考方案1】:

那么,是否可以用 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();

【讨论】:

谢谢,没有想到 Cargo。 @Vinegar 通过插件使用 Cargo 更为常见(至少我是这么认为的),但 Cargo 实际上是一个 Java API。这很方便(越来越多的容器确实提供了嵌入式 API,但 Cargo 的 API 是“统一的”)。 是的,我倾向于同意。谢谢。【参考方案2】:

bootstrap.jar 和 commons-logging-api-1.1.1 从 tomcat\bin 到你的类路径,下面的 sn-p 可能会有所帮助,

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

bootstrap.start();

Thread.sleep(60000);

bootstrap.stop();

【讨论】:

【参考方案3】:

我正在使用follow方法:

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 中的类路径复制我的类并从 web-inf/lib 中的类路径复制“jar”。

【讨论】:

【参考方案4】:

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

为了回答您的问题,您可以使用系统调用从 Java 执行相关的 .sh.bat 文件。像下面这样,

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

【讨论】:

以上是关于如何使用 Java 启动和停止 Tomcat 容器?的主要内容,如果未能解决你的问题,请参考以下文章

centos7中使用yum安装tomcat以及它的启动停止重启

如何将文件夹添加到由 maven cargo 插件启动的 Tomcat 容器的类路径中

基于 Spring Boot (Tomcat) 的应用程序作为守护进程 - 如何停止?

springboot如何使用外部tomcat容器

Tomcat7.0源码分析——启动与停止服务

Tomcat7.0源码分析——启动与停止服务原理