Должно быть ясно, что Maven это инструмент для сборки, а не инструмент команды исполнителя. Запуск/остановка Jetty должна быть частью одной и той же сборки на этапе выполнения интеграционных тестов. Кроме того, вы также создаете зависимости между двумя строками maven (которые фактически не строятся действительно), что может быть проблемой как часть вашей среды CI, если когда-либо остановка сборки завершится неудачно - по какой-либо причине - и оставить запущенную причальную работу и как таковые потребляют ресурсы на вашем сервере CI для неопределенного времени.
Простой старт/тест/остановка потока может быть реализован следующим образом в рамках одного и того же Maven сборки:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>test</goal>
</goals>
<phase>integration-test</phase>
<configuration>
<excludes>
<exclude>none</exclude>
</excludes>
<includes>
<include>**/*IntegrationTest.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.8.v20150217</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<stopKey>foo</stopKey>
<stopPort>9999</stopPort>
<stopWait>2</stopWait>
<webApp>
<contextPath>/examplecomponent</contextPath>
</webApp>
<httpConnector>
<port>7777</port>
</httpConnector>
</configuration>
<executions>
<execution>
<id>start-jetty</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
<configuration>
<scanIntervalSeconds>0</scanIntervalSeconds>
</configuration>
</execution>
<execution>
<id>stop-jetty</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>9.2.8.v20150217</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
В принципе, вы настроить безошибочный плагин, чтобы пропустить интеграционные тесты во время проверки, а затем начать причал до теста интеграции, выполните интеграционные тесты (основанные на суффиксе), а затем прекратите причал.
Я бы также предложил переместить его в профиль, чтобы сделать сборку по умолчанию более быстрой и независимой от тестов интеграции, чтобы она также могла успешно работать в автономном режиме, а затем активировать профиль при необходимости (то есть в сборке CI) ,
Обновлено: если вам действительно нужно иметь начало в проекте Maven и остановку в другом модуле Maven, можно применить следующий подход: иметь агрегатор/Мультиконтроллер проект Maven: модуль обеспечит start, другой модуль обеспечит остановку, другие модули будут использовать идущий причал. Тем не менее, реактор maven может не вызывать их в том порядке, в котором вы хотите, тогда вы должны убедиться, что модуль останова зависит от модуля запуска (имеет зависимость), и любой модуль, требующий работающего модуля, также будет иметь стартовый модуль в качестве зависимости. Кроме того, модуль останова также должен зависеть от модуля тестирования, чтобы он выполнялся только в конце. Это должно делать свое дело. Поэтому, чтобы подвести итог:
- пристань-вопрос (проект агрегатора)
- старт-причал-модуль
- использование-причал-модуль (имеет запуск-Jetty-модуль как зависимость)
- стоп-причал-модуль (имеет старт-причал-модуль и использовать-причал-модуль в качестве зависимостей)
Обновлено 2: Ниже рабочий подход (проверено на машине Windows) Вот П файл проект агрегатора, молы-вопрос:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stackoverflow</groupId>
<artifactId>jetty-question</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>jetty-start</module>
<module>jetty-stop</module>
<module>jetty-use</module>
</modules>
</project>
Примечания модулей декларации и упаковки в качестве П (требуется для агрегаторы).
Вот ПОМ файл модуля Пристань-старт, который представляет собой папку вложен в молы-вопрос
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.stackoverflow</groupId>
<artifactId>jetty-question</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>jetty-start</artifactId>
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>verify</phase>
<configuration>
<target>
<exec executable="cmd.exe" spawn="true">
<arg value="/c" />
<arg value="mvn jetty:run" />
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.8.v20150217</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<stopKey>foo</stopKey>
<stopPort>9999</stopPort>
<stopWait>2</stopWait>
<webApp>
<contextPath>/jetty-start</contextPath>
</webApp>
<httpConnector>
<port>7777</port>
</httpConnector>
</configuration>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>9.2.8.v20150217</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
Примечание: модуль конфигурирования причалу модуля, а затем выполняет фоновый процесс через antrun плагин для выполнения mvn jetty: запустите В моем примере кода развернутое приложение просто предоставило индексную страницу index.html Hello world.
Вот П файл модуль мола назначение:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.stackoverflow</groupId>
<artifactId>jetty-question</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>jetty-use</artifactId>
<dependencies>
<dependency>
<groupId>com.stackoverflow</groupId>
<artifactId>jetty-start</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.47.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Важно: как описан выше, нуждается в зависимости от модуля молов пуска, так что реактор Maven сборка будет выполнять его после того, как jetty-start (и поэтому мы уверены, что пристройка будет выполняться при выполнении этой сборки). Примечания зависимости для JUnit и селена, я использовали их, чтобы эффективно проверить идущий причал с помощью теста интеграции JUnit ниже:
public class AppIntegrationTest extends TestCase {
public void testApp() throws Exception {
// Create a new instance of the Firefox driver
WebDriver driver = new HtmlUnitDriver();
// Launch the Online Store Website
driver.get("http://localhost:7777/jetty-start");
WebElement element = driver.findElement(By.id("title"));
Assert.assertNotNull(element);
Assert.assertNotNull(element.getText());
Assert.assertEquals("Hello World!", element.getText());
}
}
Наконец, здесь П файл модуля Пристани-стопа
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.stackoverflow</groupId>
<artifactId>jetty-question</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>jetty-stop</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>verify</phase>
<configuration>
<target>
<exec executable="cmd.exe" spawn="true">
<arg value="/c" />
<arg value="mvn jetty:stop" />
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.8.v20150217</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<stopKey>foo</stopKey>
<stopPort>9999</stopPort>
<stopWait>2</stopWait>
<httpConnector>
<port>7777</port>
</httpConnector>
</configuration>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>9.2.8.v20150217</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.stackoverflow</groupId>
<artifactId>jetty-start</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>com.stackoverflow</groupId>
<artifactId>jetty-use</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
Обратите внимание на аналогичную конфигурацию на модуль запуска причала. Этот модуль также настраивает плагин причала, и он останавливает его через плагин antrun, который будет выполнять в фоновом режиме mvn jetty: остановить цель. Также обратите внимание на зависимости этого модуля: он должен зависеть как от причала, так и от причала, так что сборка реактора maven будет выполнять его в конце.
Дальнейшие примечания: конфигурация причала на причале и припортовом модуле, очевидно, должна разделять ключ остановки и стопорный порт. В этом примере порт сервера привязан к файлу pom (что также должно быть одинаковым для модулей запуска и приставки), но вы также можете перенести его в свойство в родительском модуле. Кроме того, плагин antrun выполняет фоновый процесс в режиме Windows. Если вы работаете в Linux, то суффикс & также должен сделать трюк. Я бы также предложил сохранить его в многомодульном проекте, чтобы вы могли убедиться, что зависимости связаны друг с другом.
Хотя я бы не советовал этому подходу, как описано в верхней части этого ответа, было сложно и забавно заставить его работать, поэтому благодарим вас за удовольствие.Надеюсь, вы тоже заработаете.
Обычно вы не используете Maven для запуска сервера, на который должен быть направлен другой модуль. Я бы использовал Дженкинса для этого. Один случай использования, когда вы используете Maven для интеграционных тестов, где вы запускаете пристань, выполнять тесты (поэтому оставаясь в одной и той же конструкции Maven), а затем остановите причал. – Tome
@Tome Вы правы, и я использую jenkins для этого. проблема в том, что мне нужно использовать другой файл settings.xml для теста. поэтому мне придется использовать другую сборку maven. –