共享罐子的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本身可能更容易。原則上這會迫使應用程序上下文變爲範圍?
您的應用程序jar應該在WEB-INF/lib下。不在Tomcat的類路徑中。 –
你已經回答了你的問題的第一部分。標準類加載器層次結構以父方向委託工作,從不以其他方式委託工作。如果你想這樣做,你必須使用自己的自定義類加載器。請查看[本文](http://www.datastax.com/dev/blog/classloading-in-dse-analytics)瞭解類似的情況。 – Ralf
@Ralf我想問的是,它是否真的是一個等級制度,只能朝着一個方向發展 - 我想你只是回答了這個問題。我不確定。現在我必須弄清楚如何解決這個問題。 –