2015-11-26 6 views
2

Я хочу запустить Jetty с причалом-maven-plugin и закончить сборку, когда причал работает.Запустите Jetty с причалом-maven-plugin и закончите сборку, когда причал работает

Я создал pom.xml, который начинается причалом и развертывание войны файла, после причала начала я хочу Maven, чтобы закончить сборку, оставляя пристань работает, так что я мог бы начать другой Maven сборку для запуска тестов на сервере я просто запустил причал.

Затем я создам еще одну сборку maven, которая просто остановит причал.

Проблема в том, что мне не удалось запустить причал и сделать остановку maven после этого. Кто-нибудь знает, как это сделать?

p.s Я использовал «вводного раздвоенный» для этого, но он все еще ждал стоп-сигнала, так что сборка застрял.

Это мол старт профиль:

<profile> 
      <id>start-jetty</id> 
      <activation> 
       <activeByDefault>false</activeByDefault> 
      </activation> 
      <build> 
       <plugins> 
        <plugin> 
         <groupId>org.eclipse.jetty</groupId> 
         <artifactId>jetty-maven-plugin</artifactId> 
         <configuration> 
          <war>${unpacked.war.directory}</war> 
          <contextXml>${unpacked.war.directory}/WEB-INF/jetty-web.xml</contextXml> 
          <webApp> 
           <contextPath>/qabin</contextPath> 
          </webApp> 
          <systemProperties> 
           <systemProperty> 
            <name>mercy.td.sa_config_dir</name> 
            <value>${tests.runtime}</value> 
           </systemProperty> 
           <systemProperty> 
            <name>jetty.port</name> 
            <value>${jetty.start.port}</value> 
           </systemProperty> 
          </systemProperties> 
          <stopPort>${jetty.stop.port}</stopPort> 
          <stopKey>STOP</stopKey> 
         </configuration> 
         <executions> 
          <execution> 
           <id>start-jetty</id> 
           <phase>pre-integration-test</phase> 
           <goals> 
            <goal>run-forked</goal> 
           </goals> 
           <configuration> 
            <scanIntervalSeconds>0</scanIntervalSeconds> 
            <daemon>true</daemon> 
           </configuration> 
          </execution> 
         </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
+0

Обычно вы не используете Maven для запуска сервера, на который должен быть направлен другой модуль. Я бы использовал Дженкинса для этого. Один случай использования, когда вы используете Maven для интеграционных тестов, где вы запускаете пристань, выполнять тесты (поэтому оставаясь в одной и той же конструкции Maven), а затем остановите причал. – Tome

+0

@Tome Вы правы, и я использую jenkins для этого. проблема в том, что мне нужно использовать другой файл settings.xml для теста. поэтому мне придется использовать другую сборку maven. –

ответ

2

Должно быть ясно, что 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, то суффикс & также должен сделать трюк. Я бы также предложил сохранить его в многомодульном проекте, чтобы вы могли убедиться, что зависимости связаны друг с другом.

Хотя я бы не советовал этому подходу, как описано в верхней части этого ответа, было сложно и забавно заставить его работать, поэтому благодарим вас за удовольствие.Надеюсь, вы тоже заработаете.

+0

Я согласен, и я использую jenkins для своего CI. проблема в том, что мне нужно использовать другой файл settings.xml для теста. поэтому мне придется использовать другую сборку maven вместо работы с фазами. –

+0

Извините, что я видел ваш комментарий только после отправки моего ответа. С помощью settings.xml вы имеете в виду файлы Maven settings.xml? –

+0

Да. , но давайте просто скажем, что я хочу запустить свое приложение и оставить его работать, пока я не позвоню на «причал-стоп», что означает, что часть «причал» будет независимой. –