Можно ли запускать два веб-приложения одновременно при разработке с Maven / Eclipse?

Проблема в том, что мы создаем веб-приложения для клиентов. У нас также есть веб-приложение «admin», которое изменяет некоторые структуры данных клиента. Из-за характера данных оба веб-приложения должны работать в одной JVM.

В производстве это не проблема; вы просто помещаете два веб-приложения на один и тот же сервер приложений.

Однако недавно мы перешли на Mavenish способ размещения веб-приложений, и Maven хочет, чтобы на каждый проект приходилось одно веб-приложение. В Eclipse это проблема, потому что, если вы запускаете разные веб-приложения независимо, они будут в разных JVM.

Мы пытаемся использовать плагин jetty-maven-plugin для тестирования веб-приложений, но можем переключиться на что-нибудь еще, если это решит эту проблему.


person ccleve    schedule 01.04.2011    source источник
comment
В eclipse вы запускаете каждое веб-приложение на собственном сервере приложений?   -  person Dave    schedule 02.04.2011
comment
Отдельные проекты в Eclipse выполняются независимо. Когда вы выполняете Run As ... и вызываете maven-jetty-webapp, он запускает копию сервера приложений Jetty в своей собственной JVM.   -  person ccleve    schedule 02.04.2011
comment
Тот же вопрос, что и Как развернуть несколько одноранговых веб-приложений от родительского помпона, на который есть хороший ответ.   -  person stolsvik    schedule 19.09.2011


Ответы (5)


Да, вы можете :) Это делается путем определения одного модуля WAR как основного, копирования всех остальных WAR в целевой каталог основного, создания файла jetty.xml и указания подключаемому модулю Maven Jetty использовать файл jetty.xml. Вот как скопировать другие WAR с помощью плагина зависимостей Maven:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
    <execution>
        <id>copy</id>
        <phase>package</phase>
        <goals>
            <goal>copy</goal>
        </goals>
        <configuration>
            <artifactItems>
                <artifactItem>
                    <groupId>com.foo</groupId>
                    <artifactId>bar</artifactId>
                    <version>${project.version}</version>
                    <type>war</type>
                    <overWrite>true</overWrite>
                    <outputDirectory>target/</outputDirectory>
                </artifactItem>
            </artifactItems>
        </configuration>
    </execution>
</executions>

You'll need to have the com.foo:bar dependency defined in the POM as well. Here's the contents of jetty.xml:

<?xml version="1.0"?>

<!-- =========================================================== -->
<!-- Set handler Collection Structure                            -->
<!-- =========================================================== -->
<Set name="handler">
    <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
        <Set name="handlers">
            <Array type="org.eclipse.jetty.server.Handler">
                <Item>
                    <New class="org.eclipse.jetty.server.handler.ContextHandlerCollection"
                         id="Contexts">
                        <Set name="handlers">
                            <Array type="org.eclipse.jetty.server.Handler">
                                <Item>
                                    <New id="FooWebHandler"
                                         class="org.eclipse.jetty.webapp.WebAppContext"/>
                                </Item>
                            </Array>
                        </Set>
                    </New>
                </Item>
            </Array>
        </Set>
    </New>
</Set>

<Ref id="FooWebHandler">
    <Set name="contextPath">/foo</Set>
    <Set name="war">
        target/bar-${project.version}.war
    </Set>
</Ref>

А вот как указать плагину Maven Jetty использовать новый файл jetty.xml:

<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty.version}</version>
<configuration>
    <jettyConfig>${basedir}/jetty.xml</jettyConfig>
</configuration>

Now kick off jetty:run-war goal from Eclipse and you should see all WARs deploying in one Maven Jetty plugin instance. I run this from command line and it works there, YMMV with Eclipse.

person Tim Fulmer    schedule 25.05.2011
comment
Jetty.xml отлично работал у меня. Я не использую плагин Jetty Maven, но запускаю свои веб-приложения прямо из eclipse. Но остается один вопрос: почему структура двойной коллекции с ContexthandlerCollection внутри HandlerCollection? Кажется, все работает нормально, если оставить HandlerCollection и использовать ContextHandlerCollection напрямую (и наоборот). - person cupiqi09; 29.07.2020

Вы можете сделать это напрямую через плагин jetty-maven-plugin, не изменяя jetty.xml:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <configuration>
        <scanIntervalSeconds>5</scanIntervalSeconds>
        <webApp>
            <contextPath>/</contextPath>
        </webApp>
       <contextHandlers>
          <contextHandler implementation="org.eclipse.jetty.maven.plugin.JettyWebAppContext">
            <war>${project.basedir}/../secondProject.war</war>
            <contextPath>/cc</contextPath>
          </contextHandler>
        </contextHandlers>  
    </configuration>
    <executions>
        ...
    </executions>
</plugin>

Вам совсем не нужно изменять файл (ы) jetty.xml для успешного использования, и вам также не нужно копировать файл war. (хотя вы можете захотеть построить вторую войну как часть этой сборки, см. maven-invoker-plugin)

Документация здесь: http://www.eclipse.org/jetty/documentation/9.2.2.v20140723/jetty-maven-plugin.html#running-more-than-one-webapp

person Forge_7    schedule 28.11.2014

Вот пример ответа ccleve.

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.webapp.WebAppContext;
import org.eclipse.jetty.xml.XmlConfiguration;
...
public static void main(String[] args) throws Exception {
...
Server server = new Server(port);
HandlerCollection handlers = new HandlerCollection();

WebAppContext frontEndWebappContext = new WebAppContext(
     "src/main/webapp", "/test"
);
handlers.addHandler(frontEndWebappContext);

String serviceWebappBasePath = {absolute_path_to_other_webapp};
WebAppContext serviceWebappContext = new WebAppContext(
     serviceWebappBasePath + "/main/webapp", "/"
);
handlers.addHandler(serviceWebappContext);
XmlConfiguration conf = new XmlConfiguration(new File(
   serviceWebappBasePath +  "test/webapp/WEB-INF/jetty-web.xml")
.toURI().toURL().openStream());
conf.configure(serviceWebappContext);

server.setHandler(handlers);
server.start();

...

В этом случае есть интерфейсное веб-приложение, которое монтируется в «/ test», и сервисное веб-приложение, которое монтируется в «/». Мы также включаем jetty-web.xml служебного приложения.

В вашем случае та пусковая установка, которую вы создадите, должна находиться в папке «src / test», так как она не должна быть включена в вашу войну, потому что вы используете ее только в тестовых целях.

Вам также может потребоваться добавить зависимость к сервису webapp в тесте области в pom-файле внешнего веб-приложения:

<dependency>
 <groupId>{service_group}</groupId>
 <artifactId>{service_artifact_id}</artifactId>
 <version>{service_version}</version>
 <scope>test</scope>
</dependency>

или / и

<dependency>
  <groupId>{service_group}</groupId>
  <artifactId>{service_artifact_id}</artifactId>     
  <type>test-jar</type>
  <version>{service_version}</version>
  <scope>test</scope>
</dependency>
person Vincent Blouin    schedule 11.05.2013

У меня не так много опыта работы с Maven / Jetty; но у меня есть опыт работы с Tomcat на Eclipse; так что мы оба хоть что-то делаем с сервлетами в Eclipse.

В любом случае, я не знаю, создавали ли вы проекты или не использовали какой-либо из шаблонов проектов в Eclipse, но я сделал свой, используя шаблон динамического веб-проекта. Раньше я не делал двух веб-приложений; но если вы создадите два из этих проектов, а затем на вкладке серверов Eclipse создадите новый сервер и добавите к нему оба проекта, вы, возможно, сможете достичь своих целей.

Когда вы выполняете «Запуск от имени» ... вы в основном просто запускаете конфигурацию запуска по умолчанию, которую Eclipse имеет для настройки вашего проекта. Но если вы развертываете оба своих проекта на одном сервере в среде разработки, а затем выбираете этот сервер и нажимаете start, он должен просто запустить его на одной JVM; аналогично вашей производственной среде.

Как я уже сказал; Я не использую Jetty, и я никогда не использовал руководство по настройке сервера с Jetty, поэтому я не знаю, сработает ли это для вас или нет. Так что я надеюсь, что это будет полезно, но я не буду сильно удивлен, если это не так.

person Dave    schedule 03.04.2011
comment
Спасибо за предложение. Вероятно, это сработает. Проблема в том, что мы не используем WTP, и когда мы попытались его использовать, некоторые другие вещи стали неработоспособными в наших проектах. Это довольно тяжелое решение. Кроме того, у меня были проблемы с распознаванием артефактов maven. - person ccleve; 07.04.2011

Отвечая на свой вопрос:

Похоже, что это просто невозможно. Обходной путь, который мы придумали, - написать небольшой встроенный код причала и запустить его из нашего приложения. Jetty позволяет программно добавлять несколько веб-приложений. Он также позволяет создавать несколько баз ресурсов, то есть каталогов для каждого веб-приложения, что позволяет использовать наложения. Пока все работает отлично.

person ccleve    schedule 12.04.2011