如何使用 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 容器的类路径中