2011-07-14 122 views
11

我在我的webapp文件夾中有3場戰爭。其中兩個建立在第三個服務之上。我處於測試環境,即我無法控制其架構,所以我無法改變一件事情。所以...有沒有辦法在tomcat6中執行部署順序?

問題:有沒有辦法在tomcat中執行部署順序?

我已經遇到了一個問題here在stackoverflow,但沒有解決方案。

那麼,實際上這傢伙建議將webapps的名稱更改爲字母順序將有所幫助。然而,每當我需要測試這些和不同的戰爭時,我都不願意這樣做。

我認爲有一種方法可以配置tomcat conf .xml文件之一。我只是不知道哪一個。

+0

可能重複[如何在重新啓動tomcat時控制webapp部署順序](http://stackoverflow.com/questions/2539245/how-to-control-webapp-deployment-order-when-restarting-tomcat) –

+0

它是重複的如果我引用這個問題?另外,我正在使用tomcat6。 – wleao

回答

15

從Tomcat維基 - What order do webapps start (or How can I change startup order)?

沒有預計的啓動順序。 Servlet規範和Tomcat都沒有定義其中之一。您不能依賴任何以特定順序開始的應用程序。

Tomcat有從來沒有支持指定webapps的加載順序。還有其他容器,如JBoss,但Tomcat從來沒有。任何看起來像通過網絡應用名稱的字母順序加載排序的明顯行爲都是巧合,並不能保證在所有情況下都能正常工作。

如果web.xml指定加載的順序爲servlets,那麼您可能想到的是<load-on-startup/>元素。

這就是說有一個優雅的解決方案使用服務發現協議。

一種解決方案是使用諸如ZeroConf之類的東西,並在啓動時註冊您的服務,然後讓相關應用程序查找這些服務何時可用,並讓它們連接並執行他們需要執行的操作準備。這就是我多年來一直在處理多個相關服務的方式。我有Python,Java和Erlang服務通過ZeroConf無縫地發現彼此。

0

您總是可以將第一個.war文件移動到tomcat目錄中,然後等待它進行部署,然後將下兩個文件移動到tomcat目錄中。這將部署第一個,然後部署其他兩個。

或者你所能使用的事實,Tomcat將掃描目錄和部署第一場戰爭,那麼第二戰,那麼第三戰字母

+0

我會嘗試。但是一些外部配置呢?就像我說的,在一個xml文件中? – wleao

+0

「呃,其實這個傢伙建議把webapps的名字改爲按字母順序排列會有所幫助,但是,**我不願意每次需要測試那些和不同的戰爭**」 – wleao

+0

我沒有' t觸及了tomcat的XML,真的我不想爲我的企業應用程序構建。寧願能夠在股票tomcat上運行它,不需要額外的擺弄... – TravMan

7

確實,tomcat沒有提供任何方法來執行部署順序。

* Tomcat的部署的webapps按照以下順序: *

1.Any上下文描述符將會首先部署。

2。然後將部署未被任何上下文描述符引用的分解的Web應用程序。如果他們在的appBase相關的.WAR文件,它比展開的Web應用程序更新,展開的目錄將被刪除,web應用程序將從.WAR

3.WAR文件重新部署將部署

>這裏是一個建議的解決方案:


如果要指定部署順序,然後定義在$ CATALINA_BASE/conf目錄/ [引擎]/[主機名]/MyApp的您的Web應用程序的上下文。 xml

Tomcat通過執行File listFiles()來掃描$ CATALINA_BASE/conf/[enginename]/[hostname] /,該文件返回一個按哈希值排序的文件數組(依賴於操作系統)。

您可以使用下面的代碼,以檢查那些爲了web應用將被部署

File file = new File("/opt/tomcat/conf/Catalina/localhost"); 
     File[] files = file.listFiles(); 
     for (File f : files) 
     { 
      System.out.println("Filename: " + f.getName()); 
     } 
+0

這種方法似乎相當危險,因爲它是Tomcat團隊隨時可以隨意更改的實現細節......此外,在他們自己的wiki中,明確指出_沒有預期的啓動順序。 Servlet規範和Tomcat都沒有定義一個_... – Lucas

0

這是很容易做到,如果你不小心黑客一點Tomcat的代碼,並創建自己的主機實例

1)創建org.apache.catalina.core.StandardHost的子類,說MYHOST:

class MyHost extends org.apache.catalina.core.StandardHost{ 
    public MyHost(){ 
    super(); 
    //changing HashMap for a predictable ordered Map :) 
    this.children = new LinkedHashMap(); 
    } 
} 

2)註冊於服務器的XML標籤的主機類()

令人難以置信,因爲它看起來,它只要你有宣佈以正確的順序主機標籤內所有的Web應用程序解決了這個問題:

<Host> 
<context app1> 
<context app2> 

Thaen APP1將APP 2開始前,無論你使用的是哪個。

1

道歉跨頁(Tomcat - starting webapps in a specific order),但我認爲這是相關這裏太:

您可以定義多張服務在server.xml中,它在不同的端口上運行。服務按照它們在server.xml中出現的順序依次啓動。這意味着您可以擁有 - 例如 - 在第一個服務中運行配置服務,然後在第二個服務中運行依賴它的應用程序(我使用默認的Catalina一個用於其餘部分...)

您可以在這裏看到更多的信息: http://wiki.apache.org/tomcat/FAQ/Miscellaneous#Q27

這是我包括服務之前卡塔利娜服務:

<Service name="ConfigService"> 
    <Connector port="8081" protocol="HTTP/1.1" 
     connectionTimeout="20000" 
     redirectPort="8444" /> 
    <Engine name="ConfigServiceEngine" defaultHost="localhost"> 
     <Host name="localhost" appBase="webapps" 
      unpackWARs="true" autoDeploy="true" 
      xmlValidation="false" xmlNamespaceAware="false"> 

      <Context path="/" reloadable="true" docBase="/path/to/your/service/directory" /> 
     </Host> 
    </Engine> 
</Service> 

正如你所看到的,我用的文檔庫,而不是的appBase,但你應該如果你願意,可以配置一個不同的appBase ...

注意改變服務和引擎的名稱很重要。

HTH

2

有三種方式部署在Tomcat中webapp.war

  1. 添加Context元素的Host元素中的$CATALINA_BASE/conf/server.xml文件。

    <Server><Service><Engine><Host> 
        <Context path="[webappName]" docBase="[webappPath]"/> 
    </Server></Service></Engine></Host> 
    
  2. 與內容創建$CATALINA_BASE/conf/[engineName]/[hostName]/[webappName].xml文件:

    <Context docBase="[webappPath]"/> 
    
  3. 直接添加webapp.war文件中$CATALINA_BASE/webapps/目錄。

下部署順序將發生在Tomcat啓動:

1→2→3


幾點說明:

  • $ CATALINA_BASE

    請參閱解決大多數相對路徑的基本目錄。如果您尚未通過設置CATALINA_BASE目錄將Tomcat配置爲多個實例,則$ CATALINA_BASE將被設置爲$ CATALINA_HOME(您已安裝Tomcat的目錄)的值。

  • 的docBase

    的路徑到Web應用程序WAR文件。您可以爲此WAR文件指定一個絕對路徑名,或者指定相對於擁有主機的appBase目錄的路徑名。

  • 引擎名稱:

    相關的上下文引擎的名稱。默認名稱是Catalina

  • 主機名:

    相關的上下文的主機的名稱。默認名稱是localhost


假設:

  • 有3個web應用:a.warb.warc.war
  • b.war取決於a.war
  • c.war取決於b.war
  • Server.Service.Engine.name = 「卡特琳娜」
  • Server.Service.Engine.Host.name = 「localhost」 的
  • 服務器。Service.Engine.Host.appBase = 「web應用」

嘗試以下步驟:

  1. 把所有的戰爭文件到$CATALINA_BASE/webapps/目錄。
  2. 創建$CATALINA_BASE/conf/Catalina/localhost/b.xml文件的內容:

    <Context docBase="b.war"/> 
    
  3. 添加Context元素在$CATALINA_BASE/conf/server.xml文件:

    <Server><Service><Engine><Host> 
        <Context path="a" docBase="a.war"/> 
    </Server></Service></Engine></Host> 
    

參考:

0

我們運行多個雄貓。我們可以通過將第一個組放在一個tomcat中,然後將第一個組放在一個獨立的tomcat中來獨立地創建一組應用程序。

這假設他們沒有試圖使用JVM彼此通信。

相關問題