2

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

org.eclipse.jetty:jetty-maven-plugin9.2.2.v20140723撰写本文时的版本)。

例如,

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

官方文档在httpConnector下说明了这一点

name: 
   The name of the connector, which is useful for configuring contexts to 
   respond only on particular connectors.

太好了,所以我配置了 aname但是如何将它绑定到 a 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>

这个尚未迁移的 wiki建议可以使用 上的connectorNames属性来完成WebAppContext,但这不再可用。

4

3 回答 3

4

看看文档:

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

也可以使用带有命名连接器的虚拟主机机制的扩展,以使某些 Web 应用程序只能由特定连接器访问。如果连接器使用 setName 方法设置了名称“MyConnector”,则可以使用特殊的虚拟主机名“@MyConnector”来引用它。

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

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

使用@ConnectorName:

@ConnectorName 连接器名称,严格来说不是虚拟主机,而是仅匹配在连接器上接收到的请求,这些连接器具有使用 Connector.setName(String) 设置的匹配名称。

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

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

那应该与相应的连接器绑定。

您也可以在 Java 中以编程方式执行此操作。

于 2014-09-05T12:55:33.633 回答
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>

于 2014-09-13T19:31:17.500 回答
0

我会尝试使用jettyXml参数而不是connectorand来做到这一点contextHandlers。为每个战争编写一个xml 配置文件jettyXml,并在 pom.xml 的参数中引用它们。

于 2014-09-05T11:48:17.427 回答