Как запустить и остановить контейнер Tomcat с Java?

У меня есть проект Maven, который запускает контейнер tomcat для pre-integration-тестов (jUnit Tests). Большинство моих тестов требуют перезапуска веб-приложения в тестах. Поэтому я хотел бы перезапустить контейнер Tomcat до того, как будет выполнен каждый тест jUnit.

На данный момент я использую plug-maven2-plugin для настройки контейнера tomcat.

Итак, можно ли запустить и остановить контейнер с помощью инструкции java?

Ответ 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();

Ответ 2

bootstrap.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();

Ответ 3

Я использую следующий метод:

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

Но метод имеет одну проблему - мне нужно скопировать WAR файл в каталог "webapps" каждый раз, когда есть исходный код изменения. Я делаю то, что копирует мой класс из classpath в web-inf и копирует "jar" из classpath в web-inf/lib.

Ответ 4

Да, это так. Но я африканец, сколько времени проведут ваши испытания. Вы должны исправить свои тесты, чтобы не зависеть от запуска и выключения сервера. Его штраф для запуска тестов внутри контейнера, но контейнер следует запускать один раз перед тестами.

Чтобы ответить на ваш вопрос, вы можете выполнить соответствующие файлы .sh или .bat с Java с помощью системных вызовов. Что-то вроде ниже,

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