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文件,如上所述
问题:
我已经尝试过\检查以下
答案 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的一个分支,它们正在增强。