我开发并测试了一个应用程序作为War文件,并且在游戏的最后阶段,DevOps公司已经断言我正在处理的应用程序将被部署为共享的Jar文件。部署环境是Windows Server 2008R2上的Tomcat6。
Web应用程序的多个(~100个)实例作为单独的Tomcat实例运行。我试图解决的问题是,一旦应用程序jar从实例库移动到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 :(得分:0)
将您的webapp部署为共享jar听起来不错。它背后的理由是什么?
你可以做的是将它分成两个罐子。您放在tomcat/lib
下的公共库内容的一个jar,以及您放在webapp logback.xml
下的特定于应用程序的内容(如WEB-INF/lib
文件)的另一个jar。
另见this question(哦,我刚注意到它也来自你:)。