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

标签 tomcat classpath manifest.mf

Tomcat 版本:5.0.28 JDK:1.5.0.14

问题:

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

我想到的解决方案:

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

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

库是 webapps\myapp\WEB-INF\lib

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

Manifest-Version: 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 会与休眠一起自动加载 但它不起作用... Tomcat 无法找到如上.MF 中指定的jar 文件

问题:

  1. 我做错了什么吗?还是 Tomcat?
  2. 这个问题还有其他解决方案吗?

我已经尝试\检查了以下内容

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

最佳答案

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

一些 servlet 容器似乎支持它,但根据 to this mailing list post (抱歉,没能这么快找到更权威的东西)它也没有在规范中指定。

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

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

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

关于Tomcat 无法从 list 文件中选择类路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/731729/

相关文章:

启用安全管理器的 Tomcat 7 和 Servlet 3.0 模式上下文加载中的 Spring

java - 在 apache/tomcat 设置 (mod_jk) 后面的 Vaadin 中获取 IP 地址总是给出服务器的 IP 地址

java - 登录后创建新 session

java - Centos中Apache Tomcat如何设置JAVA_HOME?

java - 在不设置类路径的情况下执行java程序

hadoop - 将 jars 添加到启动 map reduce 作业的代码的类路径中

java - 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

eclipse - "Export-Package: ."是什么意思?

Java WebStart - 第 3 方 jar - list

java - java.lang.NoClassDefFoundError:org/ini4j/InvalidFileFormatException通过gradle