使用Maven / Eclipse进行开发时,可以同时运行两个webapp?

时间:2011-04-01 21:27:08

标签: java web-applications maven maven-jetty-plugin

问题在于:我们为客户构建webapps。我们还有一个“管理员”webapp,可以修改一些客户端数据结构。由于数据的性质,两个webapp都必须在同一个JVM中运行。

生产中没问题;你只需将两个webapp放在同一个应用服务器中。

我们最近转而采用Mavenish的方式来布局webapps,Maven想要每个项目使用一个webapp。在Eclipse中,这是一个问题,因为如果您独立运行不同的Web应用程序,它们将位于不同的JVM中。

我们正在尝试使用jetty-maven-plugin进行webapp测试,但如果可以解决这个问题,可以切换到别的东西。

5 个答案:

答案 0 :(得分:5)

是的,你可以:)通过将一个WAR模块识别为主模块,将所有其他WAR复制到主目标目录,制作jetty.xml并告诉Maven Jetty插件使用jetty.xml来完成。以下是使用Maven依赖插件复制其他WAR的方法:

<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>

您还需要在POM中定义com.foo:bar依赖项。这是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>

现在启动jetty:来自Eclipse的run-war目标,你应该看到所有WAR部署在一个Maven Jetty插件实例中。我从命令行运行它,它在那里工作,YMMV与Eclipse。

答案 1 :(得分:5)

您可以直接通过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

答案 2 :(得分:3)

这是给出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”的前端webapp和一个安装在“/”上的服务webapp。我们还包括服务应用程序的jetty-web.xml。

在您的情况下,您要创建的启动器应位于“src / test”文件夹中,因为它不应包含在您的战争中,因为您只是想将其用于测试目的。

您可能还必须在前端webapp的pom文件中的范围测试中添加对服务webapp的依赖:

<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>

答案 3 :(得分:0)

我对Maven / Jetty没有太多经验;但我确实有Eclipse上的Tomcat经验;所以我们至少都在做Eclipse上的servlet。

无论如何,我不知道你是否已经使用Eclipse中的任何项目模板制作项目,但我使用动态Web项目模板制作了我的项目。我以前没有做过两个网络应用程序;但是如果您要创建其中两个项目,然后在Eclipse服务器选项卡中创建一个新服务器并将两个项目添加到它,您就可以实现目标。

当您执行Run As ...时,您基本上只是运行Eclipse为项目设置设置的默认运行配置。但是,如果您将两个项目部署到开发环境中的一个服务器上,然后选择该服务器并点击start,它应该只在一个JVM上启动它;与您的生产环境类似。

就像我说的那样;我没有使用Jetty,我从未在Jetty上使用过服务器设置指南,所以我不知道这是否适合你。所以我希望这会有所帮助 - 但如果不是,我不会感到非常惊讶。

答案 4 :(得分:0)

回答我自己的问题:

看来这是不可能的。我们提出的解决方法是编写一些嵌入式Jetty代码并从我们的应用程序中启动它。 Jetty允许您以编程方式添加多个Web应用程序。它还允许您创建多个资源库,即每个webapp的目录,从而启用叠加。到目前为止,它运作良好。