在Tomcat上将servlet部署为共享jar lib时的路径问题

时间:2014-02-07 17:06:28

标签: tomcat servlets logback

我开发并测试了一个应用程序作为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本身可能会更容易。原则上这会强制应用程序上下文进入范围吗?

1 个答案:

答案 0 :(得分:0)

将您的webapp部署为共享jar听起来不错。它背后的理由是什么?

你可以做的是将它分成两个罐子。您放在tomcat/lib下的公共库内容的一个jar,以及您放在webapp logback.xml下的特定于应用程序的内容(如WEB-INF/lib文件)的另一个jar。

另见this question(哦,我刚注意到它也来自你:)。