2014-02-07 56 views
0

共享罐子的lib部署Servlet時我開發和測試的應用程序爲WAR文件,並很晚在遊戲公司的DevOps已經決定了我工作的應用程序將被部署爲一個共享Jar文件。部署環境是Windows Server 2008R2上的Tomcat6。路徑問題Tomcat上

海報(〜100)中的網絡應用程序的實例被作爲單獨的Tomcat實例運行。我想解決的問題是,一旦將應用程序jar從實例lib移動到tomcat lib,我的日誌記錄配置文件logback.xml就不能被應用程序找到。它看起來有點像這樣:

/root/tomcat6/ 
      bin/ 
      lib/ 
       myapp.jar 
      conf/ 
      ... 
     myapp_inst1/ 
      myapp.properties <-- yes, this is an odd place for props 
      bin/ 
       installmyapp.bat <-- custom scripts to install and run as win service 
       startmyapp.bat  and set catalina home and work 
       stopmyapp.bat 
      conf/ 
       web.xml 
       server.xml <-- port, etc., changed for instance 
      webapp/ 
       ROOT/ 
        WEB-INF/ 
         lib/ <-- empty! 
         classes/ 
          logback.xml 
         web.xml <-- refers to servlet class in myapp.jar       
     myapp_inst2/ 
      ... 
     myapp_inst3/ 
      ... 

我的理解是,我使用的記錄器,SLF4J的logback下,簡單地使用類路徑來定位logback.xml配置文件(從http://logback.qos.ch/manual/configuration.html)。

我的理解,也就是Tomcat的構建自己的類路徑,而這些應該包括應用lib/,應用classes/tomcat/lib/目錄(http://www.mulesoft.com/tcat/tomcat-classpath)。但是,當我將應用程序jar文件移到應用程序lib/目錄之外時,我在logback.xml中設置的logback設置不再生效。

有誰知道爲什麼應用程序不再找到配置文件,並且更重要的是,如何解決這一問題?我能想到的唯一的事情是Tomcat應用上下文類加載器可以使用Tomcat的通用類加載器,但反之亦然(但那麼你怎麼解決這個問題?)

對我來說一個很大的要求是應用程序日誌文件必須是單獨的,並允許每個實例的自定義,所以我不認爲將它複製到tomcat/lib會讓我到那裏。有任何想法嗎?

  • 編輯 -

我的問題的根源似乎是tomcat的類路徑。在web應用程序入口點是tomcat通用類加載器中的servlet的情況下,它在應用程序上下文類加載器中找到的任何內容都不適用於該應用程序。遊民。

我在想辦法解決這個問題。你怎麼看?

1)重構servlet實例是一些非常,非常通用的,所以它永遠不會需要改變了產品的使用壽命。我正在談論一個servlet的裸機。然後,這個類將被應用程序上下文加載器加載,並可以在共享位置的jar中「查找」可以維護的其他應用程序。

2)而不是servlet,創建一個servlet生命週期對象的實例,如ServletContextListener,例如,將獲取一個logger對象。再次,這將被編碼爲最低限度的意圖,它永遠不會改變。使用上下文監聽器而不是servlet本身可能更容易。原則上這會迫使應用程序上下文變爲範圍?

+0

您的應用程序jar應該在WEB-INF/lib下。不在Tomcat的類路徑中。 –

+0

你已經回答了你的問題的第一部分。標準類加載器層次結構以父方向委託工作,從不以其他方式委託工作。如果你想這樣做,你必須使用自己的自定義類加載器。請查看[本文](http://www.datastax.com/dev/blog/classloading-in-dse-analytics)瞭解類似的情況。 – Ralf

+0

@Ralf我想問的是,它是否真的是一個等級制度,只能朝着一個方向發展 - 我想你只是回答了這個問題。我不確定。現在我必須弄清楚如何解決這個問題。 –

回答

0

部署你的web應用的共享罐子聽起來像一個壞主意。它背後的基本原理是什麼?

你可以做的反而是它的兩個jar分開。一個用於放置在tomcat/lib下的常用庫文件的jar文件,另一個用於放置在webapp的WEB-INF/lib下的特定於應用程序的文件(如logback.xml文件)的另一個jar文件。

另請參見this question(哦,我剛剛注意到它也是你:)。

+0

這很令人發狂,但這是由DevOps驅動的,這似乎是我公司收聽的唯一組織。我們有一臺運行超過一百個應用程序的服務器,每個服務器都有自己的tomcat實例。 DevOps希望能夠在計算機上交換單個jar文件,以同時更新所有100多個實例。我們確實需要100多份logback.xml,它不在jar裏 - 看起來我很漂亮的圖表:) –

+0

大聲笑,是的,我不得不問一次瞭解發生了什麼,但留下了自己的空間「移動罐子「答案和類似的結構變化。在這一點上,我的結構是刻在石頭上的,我必須具體找出如何使這些屬性可見。我希望有一些類路徑的tomcat魔術(tomcat似乎有很多的角落配置選項)或(唉)滾動我自己的類加載器。 –

+0

好的我看到了'logback.xml'不在jar中。爲什麼我建議在'WEB-INF/lib'下創建符號鏈接到常見的jar文件不工作(我的其他答案)? –