Tomcat无法从Manifest文件中选择类路径

时间:2009-04-08 20:40:44

标签: tomcat classpath manifest.mf

Tomcat版本:5.0.28 JDK:1.5.0.14

问题:

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

我想到的解决方案:

使用清单文件并为每个

指定不同版本的apache-commons

我的网络应用已部署为 web应用\ MyApp的

lib就是 web应用\ MyApp的\ WEB-INF \ lib中

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

  

清单 - 版本:1.0

     

Archiver-版本:Plexus Archiver   创建者:1.5.0_15-b04(Sun> Microsystems Inc.)   Class-Path:hibernatelib / slf4j-api-1.5.2.jar

并将slf4j-api-1.5.2.jar放入 web应用\ MyApp的\ WEB-INF \ lib中\ hibernatelib

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

问题:

  1. 我做错了什么?还是Tomcat?
  2. 这个问题还有另一个解决方案吗?
  3. 我已经尝试过\检查以下

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

4 个答案:

答案 0 :(得分:0)

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


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

答案 1 :(得分:0)

使用清单中Class-Path属性的唯一位置是使用(“jar”)将包含清单的java -jar theFile.jar作为可执行jar调用。

有些servlet容器似乎支持它,但根据to this mailing list post(很抱歉,找不到更快的授权),规范中也没有指定。

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

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

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

答案 2 :(得分:0)

您是否尝试过最新,最好的Tomcat版本以查看问题是否仍然存在? Tomcat 6已经有好几年了,更不用说5.5或5.0 ......

答案 3 :(得分:0)

我不相信你能做到这一点。 Tomcat没有查看JAR清单来决定CLASSPATH问题。它正在使用自己的类加载器层次结构来查找它所需的内容,使用它所说的CLASSPATH。

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

那里有two competing JSRs,但我不知道Sun模块提案的任何实现。

我知道的一个应用服务器允许您执行此操作Spring's DM server。它是Tomcat的一个分支,它们正在增强。