如何在Tomcat中定义上下文加载的顺序,或在上下文中定义一些依赖关系层次结构?

时间:2012-03-15 13:14:00

标签: java tomcat tomcat6 liferay liferay-6

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

  • B之前加载A?或
  • 在其他一切之后加载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作为Entity Manager Factory的数据源:

<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中定义应用程序加载顺序的可能性。

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

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

当@MarceloBezerra第一个链接变得明确时,$TOMCAT/conf/Catalina/localhost/annoying-portlet.xml将具有优先权(在某种意义上,$TOMCAT/conf/Catalina/localhost/中所有带有文件的上下文将在$TOMCAT/webapps中的目录之前加载$TOMCAT/conf/Catalina/localhost/annoying-portlet.xml 1}}。解决方案是禁止部署deployXML="false"文件。

怎么做?好吧,经过一段时间与Liferay优秀员工交谈后,他们发现可以通过向Host的{​​{1}}元素添加$TOMCAT_HOME/conf/server.xml属性来禁止上下文XML部署:

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

答案 2 :(得分:1)

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