2009-01-23 53 views
3

我有一個來自第三方供應商的foo.war文件。我已經通過創建conf/Catalina/localhost/foo.xml包含在我的Tomcat配置定義的上下文:在Tomcat中啓動時加載上下文/ servlet *不更改部署描述符(web.xml)

<Context docBase="/path/to/foo.war" ...> ... </Context> 

我想讓Tomcat加載了啓動foo的上下文。但foo.war文件中的WEB-INF/web.xml(部署描述符)不包含<load-on-startup>,因此Tomcat會等待第一個請求。我真的不想解包第三方foo.war來編輯他們的web.xml。另外,每次供應商發佈.war的新版本時,我都必須這樣做。

Tomcat配置中是否有任何方式告訴Tomcat在啓動時加載foo上下文?我知道在<Context>元素中,您可以設置參數,env vars等,而無需編輯web.xml。但是我在Tomcat文檔中找不到有關啓動時加載的任何內容。

回答

3

這很棘手。你受限於Tomcat和其他容器的約定,所以沒有簡單的解決方案。

您可以使用全局web.xml使用<load-on-startup>元素從.war中初始化特定的servlet和/或JSP。這是我知道的強制啓動時加載不需要修改.war文件或其中的WEB-INF/web.xml的唯一方法。請注意,您可能需要使用不同的名稱/路徑來初始化servlet和JSP以避免衝突。

當然,這樣做意味着您必須足夠了解.war才能初始化應用程序,這可能意味着查看其web.xml以確定要加載的內容。這可能會破壞目標,因爲它不是在啓動時加載任何.war文件的切實方法。但通過一些額外的工作,您可以編寫一個腳本,從.war文件的web.xml中提取必要的信息,並將其自動添加到全局web.xml中。

現在,如果您願意考慮編寫腳本來修改.war文件,那麼您可以編寫一個腳本,該腳本從.war文件中提取WEB-INF/web.xml,將<load-on-startup>子元素添加到所有<servlet>元素,並用新副本更新.war。我不知道您使用的是運行Tomcat什麼樣的環境,但這裏有一個例子bash腳本,將做的工作:

#!/bin/sh 

TEMPDIR=/tmp/temp$$ 
WARFILE=/path-to-tomcat/webapps/foo.war 

mkdir -p $TEMPDIR/WEB-INF 
pushd $TEMPDIR 
unzip -qq -c $WARFILE WEB-INF/web.xml \ 
    | sed 's#</servlet>.*#<load-on-startup>99</load-on-startup></servlet>#' \ 
    > WEB-INF/web.xml 
zip -f $WARFILE WEB-INF/web.xml 
popd 
rm -rf $TEMPDIR 

你可以運行該腳本或您的Tomcat啓動的一部分,類似的東西。希望這可以幫助。

+0

大衛給了一個很好的解決方法,我會「接受」這個答案,但我希望在Tomcat中有一種本地方式。所以我現在就把這個問題解決了。 – netjeff 2012-06-20 00:15:55

相關問題