Как запустить и остановить контейнер Tomcat с Java? - PullRequest
11 голосов
/ 03 февраля 2010

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

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

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

Ответы [ 4 ]

14 голосов
/ 03 февраля 2010

Итак, можно ли запускать и останавливать контейнер с помощью оператора 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();
5 голосов
/ 03 февраля 2010

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();
2 голосов
/ 01 июня 2011

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

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.

1 голос
/ 03 февраля 2010

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

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

Runtime r = Runtime.getRuntime();
Process p = r.exec("start.sh");
p.waitFor();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...