我搜索了主题,但没有找到任何易于理解的内容...... 我们有一个tomcat(v5.5)。部署了很多webapp。每个webapp都包含WEB-INF / lib目录中的所有库。所以有很多重复。
创建了一个经典库(XXX_API),以便组织一些常用方法。所以这个librairy会添加到每个webapp中进行编译,但不会随之部署。该librairy部署在Tomcat的共享目录中。
我们尝试在常见的librairy中使用Spring 3.1.1的JdbcTemplate集成一些DAO。 因此,我们必须在共享目录中部署Spring库,以便部署我们的XXX_API。
现在,我们无法启动所有应用程序。 其中一些因这些异常而崩溃:java.lang.IllegalArgumentException。类org.springframework.jdbc.config.JdbcNamespaceHandler未实现NamespaceHandler接口。 有关信息,它们是使用Spring 2.0.6开发的:(
问题似乎已在applicationContext.xml中本地化。
所以,我的问题在这里:
谢谢。
答案 0 :(得分:2)
你真正想问的是类加载器是如何加载的,以什么顺序加载等等。这个页面解释了很好地在tomcat容器中执行webapp的所有类加载器。它告诉他们在哪里查找类,按什么顺序,以及每个webapp以及容器本身可以看到哪些类。请注意,对tomcat版本的更改很重要。
http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html
答案 1 :(得分:1)
我在共享lib文件夹中看到的主要用途是jdbc驱动程序,jta事务管理器和其他基础结构,例如:
我不会在共享的lib文件夹中放置像spring这样的实际应用程序库。
答案 2 :(得分:0)
可能是因为一个类是由app classloader加载的,另一个是由共享的类加载器加载的。
省去麻烦,不要使用共享目录。做什么的?要节省一些磁盘空间吗?
答案 3 :(得分:0)
所以,我删除了每个Web应用程序中的所有spring jar。我导入了共享目录中的spring lib(3.1.1)。我取消选中它们(在netbeans下),在构建中没有它们。
我甚至更改了web.xml,applicationContext.xml和Spring Servlet中的声明,以便用servlet v2.5进行标准化。
现在一切似乎都很好......