1

Tomcat 版本:5.0.28 JDK:1.5.0.14

问题:

我正在使用hibernate和struts我们不是这些库的最新和最好的版本所以 - 两者都需要不同版本的apache-commons库。

我想到的解决方案:

使用清单文件并为每个指定不同版本的 apache-commons

我的网络应用程序部署为 webapps\myapp

而库是 webapps\myapp\WEB-INF\lib

我修改了 hibernate3.jar 中的 Manifest.mf 如下

清单版本:1.0

Archiver-Version: Plexus Archiver Created-By: 1.5.0_15-b04 (Sun> Microsystems Inc.) Class-Path: hibernatelib/slf4j-api-1.5.2.jar

并将 slf4j-api-1.5.2.jar 放入 webapps\myapp\WEB-INF\lib\hibernatelib

现在我希望 slf4j-api-1.5.2.jar 会与 hibernate 一起自动加载但它不工作...... Tomcat 无法找到上述 .MF 中指定的 jar 文件

问题:

  1. 难道我做错了什么?还是Tomcat?
  2. 这个问题有另一种解决方案吗?

我已经试过\检查了以下

  1. 检查文件末尾的换行符
  2. 如果我将 slf4j-api-1.5.2.jar 放在主 lib 文件夹中 - 错误就会消失 - 所以我知道它无法找到这个特定的 jar 文件
  3. 在清单文件中尝试了相对、绝对路径
4

4 回答 4

0

您是否检查过任何权限是否正确?也可能是一个想法,以确保在最后一个 Class-Path 行之后有一个换行符,这在今天早些时候帮助了我!


更新:如果 Tomcat 不支持这样的类路径声明,那么唯一想到的就是搞乱 ClassLoaders。就我个人而言,我不会那样做——在这条道路上,整个世界都有潜在的痛苦,你可能会更容易升级。对不起,我想不出更好的答案!

于 2009-04-08T20:45:28.963 回答
0

清单中的属性被使用的唯一地方Class-Path是当jar包含清单被调用为使用 (" java -jar theFile.jar") 的可执行 jar 时。

一些 servlet 容器似乎支持它,但根据这个邮件列表帖子(对不起,找不到任何更权威的东西这么快)它也没有在规范中指定。

据我了解,Web 应用程序通常使用单个类加载器加载它们的类。“正确”解决该依赖问题将需要至少 2 个不同的类加载器。

一个 hack-ish 解决方案可能是使用jarjar或类似工具将不同的库及其各自的依赖项打包在一起。

因此,您将生成一个jar包含 Hibernate 及其 apache-commons 库的另一个,以及另一个jar包含 struts 及其 apache-commons 库的文件。apache-commons 库的每个副本都将移动到不同的包(可能是hibernate.org.apache.*and struts.org.apache.*)以解决不同类版本的问题。

于 2009-04-08T21:04:32.677 回答
0

您是否尝试过最新、最好的 Tomcat 版本,看看问题是否仍然存在?Tomcat 6 已经好几年了,更别说 5.5 或 5.0 了……

于 2009-04-08T21:22:42.510 回答
0

我不相信你能做到这一点。Tomcat 不会查看 JAR 清单来决定 CLASSPATH 问题。它使用它自己的类加载器层次结构来找到它需要的东西,使用它所说的 CLASSPATH 是什么。

如果您希望应用程序的不同部分使用不同版本的 JAR,那么您听起来像是一个真正需要OSGi的人。这就是发明要解决的问题。

那里有两个相互竞争的 JSR,但我不知道 Sun 模块提案的任何实现。

我所知道的一个可以让你这样做的应用服务器是Spring 的 DM server。这是他们正在增强的 Tomcat 的一个分支。

于 2009-04-08T23:19:13.993 回答