Jetty maven插件在不同的端口上的多个webapps

时间:2014-08-31 20:30:16

标签: java jetty embedded-jetty maven-jetty-plugin jetty-9

如何使用最新版本的jetty maven插件在不同的端口上运行多个webapp?

org.eclipse.jetty:jetty-maven-plugin(撰写本文时为9.2.2.v20140723)。

如,

foo.war -> localhost:8080/
bar.war -> localhost:8081/
baz.war -> localhost:8082/

The official documententation httpConnector

下说明了这一点
name: 
   The name of the connector, which is useful for configuring contexts to 
   respond only on particular connectors.

很好,所以我配置了name但是如何将其绑定到contextHandler?这就是我到目前为止所拥有的

<plugin>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <version>9.2.2.v20140723</version>
  <configuration>
    <connectors>
      <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
        <port>8080</port>
        <name>instance_8080</name>
      </connector>
      <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
        <port>8081</port>
        <name>instance_8081</name>
      </connector>
    </connectors>
    <contextHandlers>           
      <contextHandler implementation="org.eclipse.jetty.maven.plugin.JettyWebAppContext">
        <war>a.war</war>
        <contextPath>/</contextPath>
    </contextHandler>
    <contextHandler implementation="org.eclipse.jetty.maven.plugin.JettyWebAppContext">
      <war>b.war</war>
      <contextPath>/</contextPath>
    </contextHandler>
  </contextHandlers> 
</plugin>

not yet migrated wiki表示可以使用connectorNames上的WebAppContext属性完成此操作,但不再可用。

3 个答案:

答案 0 :(得分:4)

查看文档:

http://www.eclipse.org/jetty/documentation/current/serving-webapp-from-particular-port.html

  

还可以使用具有命名连接器的虚拟主机机制的扩展来使某些Web应用程序仅可由特定连接器访问。如果连接器有一个名称&#34; MyConnector&#34;使用setName方法设置,然后可以使用特殊的虚拟主机名&#34; @ MyConnector&#34;来引用它。

然后你可以暗示上下文,因为它将包含虚拟主机:

http://www.eclipse.org/jetty/documentation/current/configuring-virtual-hosts.html#different-virtual-hosts-different-contexts

使用@ConnectorName:

  

@ConnectorName   连接器名称,它不是严格意义上的虚拟主机,而是仅匹配在具有与Connector.setName(String)匹配的名称的连接器上接收的请求。

上面链接中的配置基于单独的jetty xml配置文件。我还没有对此进行过测试,但您可以将其插入contextHandler(它有一个setter):

<virtualHosts>
    <virtualHost>@instance_8080</virtualHost>
</virtualHosts>

应与相应的连接器绑定。

你也可以用Java编程。

答案 1 :(得分:4)

扩展@BLuEGoD的答案,这是完整的工作配置

插件配置:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.2.2.v20140723</version>
    <configuration>
        <jettyXml>path/to/jetty.xml</jettyXml>
    </configuration>
</plugin>

jetty.xml配置

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<Set name="connectors">
    <Array type="org.eclipse.jetty.server.Connector">
        <Item>
            <New class="org.eclipse.jetty.server.ServerConnector">
                <Arg> <Ref refid="Server"/> </Arg>
                <Set name="port">8080</Set>
                <Set name="name">instance_8080</Set>
            </New>
        </Item>
        <Item>
            <New class="org.eclipse.jetty.server.ServerConnector">
                <Arg> <Ref refid="Server"/> </Arg>
                <Set name="port">8081</Set>
                <Set name="name">instance_8081</Set>
            </New>
        </Item>
    </Array>
</Set>

<New id="context-foo" class="org.eclipse.jetty.maven.plugin.JettyWebAppContext">
    <Set name="contextPath">/</Set>
    <Set name="war">foo.war</Set>
    <Set name="virtualHosts">
        <Array type="java.lang.String">
            <Item>@instance_8080</Item>
        </Array>
    </Set>
</New>

<New id="context-bar" class="org.eclipse.jetty.maven.plugin.JettyWebAppContext">
    <Set name="contextPath">/</Set>
    <Set name="war">bar.war</Set>
    <Set name="virtualHosts">
        <Array type="java.lang.String">
            <Item>@instance_8081</Item>
        </Array>
    </Set>
</New>

<Set name="handler">
    <New class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
        <Set name="handlers">
            <Array type="org.eclipse.jetty.server.Handler">
                <Item>
                    <Ref refid="context-foo" />
                </Item>
                <Item>
                    <Ref refid="context-bar" />
                </Item>
                <Item>
                    <New class="org.eclipse.jetty.server.handler.DefaultHandler" />
                </Item>
            </Array>
        </Set>
    </New>
</Set>

答案 2 :(得分:0)

我尝试使用jettyXml参数代替connectorcontextHandlers。为每场战争写一个xml config file,并在你的pom的jettyXml参数中引用它们。