Tomcat:如何使用共享的lib目录?

时间:2012-11-16 16:45:34

标签: java spring tomcat

我搜索了主题,但没有找到任何易于理解的内容...... 我们有一个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中本地化。

所以,我的问题在这里:

  • 如何使用Tomcat的共享目录?
  • 与Web应用程序的lib目录相比,它是否优先加载?
  • 只是在applicationContext.xml中声明了一个关于命名空间的pb?
  • 是否可以同时使用两种弹簧版本?

谢谢。

4 个答案:

答案 0 :(得分:2)

你真正想问的是类加载器是如何加载的,以什么顺序加载等等。这个页面解释了很好地在tomcat容器中执行webapp的所有类加载器。它告诉他们在哪里查找类,按什么顺序,以及每个webapp以及容器本身可以看到哪些类。请注意,对tomcat版本的更改很重要。

http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html

答案 1 :(得分:1)

我在共享lib文件夹中看到的主要用途是jdbc驱动程序,jta事务管理器和其他基础结构,例如:

  1. 容器需要可用(在jdbc和jta的情况下,用于创建jndi数据源和jta用户事务)
  2. 当您要使用OCI版本的oracle驱动程序时,是否特定于环境,如jdbc驱动程序。在这种情况下,您必须将ojdbc.jar文件与该计算机上安装的本机oracle客户端库的版本进行匹配。另一个例子是jms连接器。
  3. 任何使用本机库的东西,因为多次加载该jar会在第二次尝试加载本机库时引起问题。
  4. 我不会在共享的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进行标准化。

现在一切似乎都很好......