【问题标题】:How to define the order of context loading in Tomcat, or defining some dependency hierarchy among contexts?如何定义Tomcat中上下文加载的顺序,或者定义上下文之间的一些依赖层次?
【发布时间】:2012-04-01 00:04:32
【问题描述】:

假设我有两个 Web 应用程序要部署在 Tomcat 6 中,包装为 A.warB.war。有没有办法强制 Tomcat 在重新启动时:

  • A 之前加载B?或
  • 在其他所有内容之后加载A?或
  • 使A只有在B被加载后才可加载——也就是说,使B成为A的依赖?

这些是问题。下面是一个可能过于复杂但也非常有用的背景。

背景

我正在尝试在 Liferay 中部署一些 portlet。这些 portlet 是由不太了解 Liferay 工作原理的人编写的遗留代码,他们做出了“惊人的”决定,例如将 Liferay Service Builder 实体表映射到新类。实际上,这并不过分,但了解 Liferay 的人可能会更好地理解我的观点。

这些 portlet 由 Spring 接合并由 Hibernate 映射到数据库。为了避免编辑 context.xml 的烦人要求(这很烦人、容易出错、容易忘记、使持久层变慢等),我将 Liferay 数据源作为新 bean 提供...

<bean id="liferayDataSource" 
    class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
    <property name="targetDataSource">
        <bean
            class="com.liferay.portal.kernel.util.InfrastructureUtil"
            factory-method="getDataSource" />
    </property>
</bean>

...并将这个新 bean 用作实体管理器工厂的数据源:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="liferayDataSource"/>
    <property name="persistenceUnitName" value="liferay-db" />
</bean>

如果我让 Liferay 运行并且我部署了我的 portlet,它运行没有问题,因为 Liferay 资源已经可用。问题是,当我重新启动 Liferay 时,这些 portlet 会在 Liferay 应用程序启动之前加载,因此 InfrastructureUtil 类甚至还没有加载。所以,我想推迟 portlet 的加载。

我注意到每个应用程序在$CATALINA_HOME/temp/ 下都有一个目录,通常称为0-this-annoying-portlet2-that-weird-portlet 等。我相信开头的数字决定了顺序,因为它强制对应用程序进行字母排序.真的吗?我可以设置这个数字吗?

当然,我接受任何解决方案,但我真的很好奇在 Tomcat 中定义应用程序加载顺序的可能性。

【问题讨论】:

    标签: java tomcat tomcat6 liferay liferay-6


    【解决方案1】:
    【解决方案2】:

    问题在于,在 Liferay 6.0 SP2 包中,Tomcat 为每个 portlet 部署了一个 XML 上下文文件。所以当我部署我的annoying-portlet 时,会创建一个$TOMCAT/conf/Catalina/localhost/annoying-portlet.xml 文件。当 Tomcat 重新启动时,这些 XML 上下文文件被读取,相应的项目被加载(顺便按字母顺序),portlet 在 Liferay 之前启动,其上下文名称为ROOT

    正如@MarceloBezerra 第一个链接明确指出的那样,$TOMCAT/conf/Catalina/localhost/annoying-portlet.xml 将具有优先权(从某种意义上说,在$TOMCAT/conf/Catalina/localhost/ 中包含文件的所有上下文都将在$TOMCAT/webapps 中只有目录的上下文之前加载。解决方案是禁止$TOMCAT/conf/Catalina/localhost/annoying-portlet.xml文件的部署。

    怎么做?好吧,在与 Liferay 的优秀员工交谈了一段时间后,他们发现可以通过将 deployXML="false" 属性添加到来自 $TOMCAT_HOME/conf/server.xmlHost 元素来抑制上下文 XML 部署:

    <Host autoDeploy="true" 
        appBase="webapps" name="localhost" unpackWARs="true" 
        xmlNamespaceAware="false" xmlValidation="false">
    

    【讨论】:

      【解决方案3】:

      Liferay 可以被强制成为第一个加载的应用程序,在文件 $TOMCAT/conf/server.xml 的标签内定义其上下文:

      <Host autoDeploy="true" 
      appBase="webapps" name="localhost" unpackWARs="true" 
      xmlNamespaceAware="false" xmlValidation="false">
         ....
         <Context path="" crossContext="true" docBase="ROOT">
             ....
         </Context>
         ....
      </Host>
      

      并删除文件 $TOMCAT/conf/Catalina/localhost/ROOT.xml

      【讨论】:

        猜你喜欢
        • 2011-03-18
        • 1970-01-01
        • 2022-08-13
        • 2012-07-28
        • 2010-12-10
        • 1970-01-01
        • 2021-10-30
        • 1970-01-01
        • 2012-04-20
        相关资源
        最近更新 更多