0

我对主题进行了搜索,但没有找到任何易于理解的内容……我们有一个 tomcat (v5.5)。上面部署了很多webapp。每个 webapp 都有 WEB-INF/lib 目录中的所有库。所以有很多重复。

为了组织一些常用方法,创建了一个经典库(XXX_API)。所以这个库被添加到每个 web 应用程序中进行编译但不与它们一起部署。该库部署在 Tomcat 的共享目录中。

我们尝试在公共库中使用 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

4 回答 4

2

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

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

于 2012-11-16T16:48:23.190 回答
1

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

  1. 容器需要可用(在 jdbc 和 jta 的情况下,创建 jndi 数据源和 jta 用户事务)
  2. 当您要使用 OCI 版本的 oracle 驱动程序时,是否特定于环境,例如 jdbc 驱动程序。在这种情况下,您必须将 ojdbc.jar 文件与安装在该机器上的本机 oracle 客户端库的版本相匹配。另一个例子是 jms 连接器。
  3. 任何使用本机库的东西,因为多次加载该 jar 会在第二次尝试加载本机库时导致问题。

我不会将诸如 spring 之类的实际应用程序库放在共享 lib 文件夹中。

于 2012-11-16T18:54:41.980 回答
0

可能是因为一个类由应用程序类加载器加载,另一个由共享类加载器加载。

省去麻烦,不要使用共享目录。做什么的?为了节省一些磁盘空间?

于 2012-11-16T16:56:50.967 回答
0

所以,我已经删除了每个 web 应用程序中的所有 spring jar。我导入了共享目录中的spring lib(3.1.1)。我取消选中它们(在 netbeans 下)以使它们不在构建中。

我什至更改了 web.xml、applicationContext.xml 和 Spring Servlet 中的声明,以便使用 servlet v2.5 进行标准化。

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

于 2012-11-19T16:12:51.930 回答