如何创建一个自定义的Tomcat会话管理器,而无需将jar文件放在CATALINA_HOME目录中?

5
我正在为Tomcat开发一个自定义会话管理器,目前已经实现了,但有一个问题:我必须把jar文件(以及所有相关的jar文件)放在CATALINA_HOME/lib目录下,否则会出现noclassdef找不到异常,即使这些类在WEB-INF/lib目录中也是如此。
请问是否有办法强制Tomcat在加载会话管理器时查找Web应用程序的lib目录?将其放在lib目录中容易出错(因为您需要记住在升级和/或安装到新系统时复制该jar文件),并且会使jar包的开发更加困难。

我不擅长Java,只是提供我的意见。如果会话管理器被Tomcat使用而不是特定的上下文,则应该部署在Tomcat使用的类路径中,而不是特定上下文的类路径中。我说得对吗? - Ken Cheung
要明确一点,我并没有在Tomcat服务器的context.xml中定义管理器,而是在我的应用程序的context.xml中定义它,因此我想WEB-INF/lib目录应该在解析之前被加载(或者至少在管理器部分被解析之前),但事实并非如此... 但是我绝不是Tomcat甚至Web应用程序专家,所以我可能完全错了。 - user439407
1个回答

5
从Tomcat 7.0.27开始,您在文件中的元素将由commons-digester处理,并且有效的ClassLoader将设置为加载ContextConfig类的ClassLoader -- 一个坚定地驻留在Tomcat服务器ClassLoader中的ClassLoader,它位于具有访问Web应用程序类的任何内容的ClassLoading链之外。因此,在不修改Tomcat源代码的情况下,将无法从Web应用程序中加载您的Manager。考虑加入Tomcat用户邮件列表以讨论此功能。
编辑2015-067-01
如果要为Web应用程序指定ClassLoader,则需要在中使用元素:http://tomcat.apache.org/tomcat-8.0-doc/config/loader.html

你能否提供你所参考的链接? - Shellum
答案很有帮助。只要有经理类加载器选择文档的链接就更好了。我在变更日志中找不到它。 - Shellum
添加了一个到<Loader>文档的链接。它没有出现在变更日志中,因为它从来没有被更改过... 它已经成为一个很好的功能有一段时间了。 - Christopher Schultz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接