如何将多个上下文映射到Jetty中的同一个war文件?

时间:2011-06-21 03:41:19

标签: java deployment jetty

是否可以将多个contextPath映射到Jetty中的一个WAR文件?例如

${jetty.home}/webapp/bookstore.war

然后我想有两个不同的背景指向这场战争。原因是某些配置差异取决于到达哪个URL。

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/magazines</Set>
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set>
</Configure>

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/books</Set>
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set>
</Configure>

3 个答案:

答案 0 :(得分:3)

我是这样做的,我也为每个站点设置了不同的SSL证书(未显示)。我并没有声称理解我所知道的一切,但这在几个装置中对我有用。每个实例都需要一个“jetty.xml”和一个“contexts.xml”文件。

假设jetty安装在/ opt / Jetty ......

启动服务器的两个实例,引用两个版本的jetty.xml(这可以在一个脚本中完成,如图所示,或者在两个单独的启动脚本中完成)

... start.sh

cd /opt/Jetty 
java -jar start.jar etc/jetty.xml etc/jetty2.xml

如果您的服务器具有多个ip,则可以使用context.xml文件在每个jetty.xml文件的connector部分中指定不同的ip或主机名。如果您只有一个ip,那么您将使用context xml中的上下文路径设置来区分这两个实例。

在jetty.xml中,请参阅第一个实例的 ip或host 目录以包含context.xml

<Call name="addConnector">
   <Arg>
       <New class="org.mortbay.jetty.nio.SelectChannelConnector">
         <Set name="host">HOST OR IP FOR FIRST INSTANCE</Set>
         <Set name="port"><SystemProperty name="jetty.port" default="80"/></Set>
         <Set name="maxIdleTime">30000</Set>
         <Set name="Acceptors">2</Set>
         <Set name="statsOn">false</Set>
         <Set name="confidentialPort">443</Set>
         <Set name="lowResourcesConnections">5000</Set>
         <Set name="lowResourcesMaxIdleTime">5000</Set>
       </New>
   </Arg>
 </Call>
 <Call name="addLifeCycle">
   <Arg>
     <New class="org.mortbay.jetty.deployer.ContextDeployer">
       <Set name="contexts"><Ref id="Contexts"/></Set>
       <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts/directory_for_FIRST_instance</Set>
       <Set name="scanInterval">5</Set>
     </New>
   </Arg>
 </Call>
在jetty.xml中

,请参阅第二个实例的 ip或host 目录以包含context.xml

<Call name="addConnector">
   <Arg>
       <New class="org.mortbay.jetty.nio.SelectChannelConnector">
         <Set name="host">HOST OR IP FOR SECOND INSTANCE</Set>
         <Set name="port"><SystemProperty name="jetty.port" default="80"/></Set>
         <Set name="maxIdleTime">30000</Set>
         <Set name="Acceptors">2</Set>
         <Set name="statsOn">false</Set>
         <Set name="confidentialPort">443</Set>
         <Set name="lowResourcesConnections">5000</Set>
         <Set name="lowResourcesMaxIdleTime">5000</Set>
       </New>
   </Arg>
 </Call>
 <Call name="addLifeCycle">
   <Arg>
     <New class="org.mortbay.jetty.deployer.ContextDeployer">
       <Set name="contexts"><Ref id="Contexts"/></Set>
       <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts/directory_for_SECOND_instance</Set>
       <Set name="scanInterval">5</Set>
     </New>
   </Arg>
 </Call>

如果如上所示定义,您可以通过触摸上下文xml文件重新加载war文件并重新启动应用程序。

将单独的上下文文件放在上下文目录的单独子目录中,每个子目录指向同一个war文件,但具有不同的上下文路径和不同的虚拟主机。

/opt/Jetty/contexts/subdirectory_for_first_instance/context_first.xml
/opt/Jetty/contexts/subdirectory_for_second_instance/context_second.xml

在context_first.xml中 - 您可以指定一个始终链接到第一个应用程序的节点(firstapp)

<Set name="contextPath">/firstapp</Set>

在context_second.xml中 - 您可以指定一个始终链接到第二个应用程序的节点(firstapp)

<Set name="contextPath">/secondapp</Set>

(以上是必要的(两个不同的上下文路径)如果你想从同一个ip运行它们,我相信)

然后在单独的上下文文件中定义两个虚拟主机(必须映射浏览器正在使用的URL):
在context_first.xml中:

<Set name="virtualHosts">
  <Array type="String">
    <Item>www.my_first_app.com</Item>
  </Array>
</Set>

在context_second.xml

<Set name="virtualHosts">
  <Array type="String">
    <Item>www.my_second_app.com</Item>
  </Array>
</Set>

注意: 如果你有两个ip或主机名,你可以将两个应用程序的上下文路径设置为“/”
如果您只有一个IP,则上下文路径将确定访问哪个应用程序

此外,重要的是,您可以将上下文参数发送到您的应用程序,以便在必要时可以确定它是哪个实例。

向每个实例发送唯一值的上下文参数示例:

 <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
 <!-- Custom context configuration                                  -->
 <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
 <Set name="initParams">
   <New class="java.util.HashMap">
    <Put name="customer">Joes Fish Store</Put>
    <Put name="ShowPanelNames">N</Put>
    <Put name="FiscalYearStartMonth">10</Put>
    <Put name="LiveEmail">Y</Put>
   </New>
 </Set>

答案 1 :(得分:0)

您只需复制war文件并重命名即可。

答案 2 :(得分:0)

我意识到这已经过时但是由于提供的答案并没有真正回答这个问题,为了将来参考,你可以通过向{WebappContext添加id属性来使用相同的.war来实现多个Configure {1}}。

<Configure id="magazinesContext" class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/magazines</Set>
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set>
    <Set name="extractWAR">true</Set>
</Configure>

<Configure id="booksContext" class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/books</Set>
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set>
    <Set name="extractWAR">true</Set>
</Configure>

但请注意,必须使用

将上下文中定义的所有命名资源分配给上下文
<Arg>
    <Ref id="magazinesContext" />
</Arg>

因此,如果你有dbcp pooling资源“pg_conn”,而没有引用WebappContext的id的Arg(在这种情况下是“magazinesContext”或“booksContext”),资源将被全局定义,即最后加载的WebAppContext获胜。

以下面的WebappContext定义为例,其中“pg_conn”是全局定义的:

<Configure id="magazinesContext" class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/magazines</Set>
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set>
    <Set name="extractWAR">true</Set>
    <New id="pg_conn" class="org.mortbay.jetty.plus.naming.Resource">
        <Arg>jdbc/db</Arg>
        <Arg>
            <New class="org.apache.commons.dbcp.BasicDataSource">
                <Set name="driverClassName">org.postgresql.Driver</Set>
                <Set name="url">jdbc:postgresql://localhost:5432/test_db</Set>
                <Set name="username">test</Set>
                <Set name="password">*****</Set>
            </New>
        </Arg>
    </New>
</Configure>

和这个,它是为WebappContext的实例定义的:

<Configure id="magazinesContext" class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/magazines</Set>
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set>
    <Set name="extractWAR">true</Set>
    <New id="pg_conn" class="org.mortbay.jetty.plus.naming.Resource">
        <Arg>
            <Ref id="magazinesContext" />
        </Arg>
        <Arg>jdbc/db</Arg>
        <Arg>
            <New class="org.apache.commons.dbcp.BasicDataSource">
                <Set name="driverClassName">org.postgresql.Driver</Set>
                <Set name="url">jdbc:postgresql://localhost:5432/test_db</Set>
                <Set name="username">test</Set>
                <Set name="password">*****</Set>
            </New>
        </Arg>
    </New>
</Configure>