【问题标题】:Tomcat cant pick class-path from Manifest fileTomcat 无法从清单文件中选择类路径
【发布时间】:2010-10-18 10:03:46
【问题描述】:

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

存档器版本:Plexus 存档器 创建者:1.5.0_15-b04(Sun> Microsystems Inc.) 类路径: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. 在清单文件中尝试了相对、绝对路径

【问题讨论】:

    标签: tomcat classpath manifest.mf


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 好吧-那你如何实现我想要做的?我在两个不同的库之间有一个共享库如何协调它们?
    • Kool 这有助于我试图提高你的答案,但没有足够的代表:)
    • 没问题,很高兴我能帮上忙。
    【解决方案2】:

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


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

    【讨论】:

    • 是的 - 我已经检查了换行符。我需要检查什么权限?
    • 看看规范@@java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html 我认为你应该确保每个条目后都有一个换行符,它在语法中。
    • 抱歉,可能没有权限。我已经看到一些参考资料说您 Tomcat 将忽略在 WEB-IN/lib 的清单文件中声明的类路径内容 - 但没有官方声明,抱歉。
    • 感谢 Saua 和 Brabster 的帮助,我将四处闲逛,看看是否有其他人对此有想法。这似乎很重要——我同意必须有一个结构化的解决方案——我不想搞乱自定义类路径
    【解决方案3】:

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

    【讨论】:

    • 还没有。我想我可以试试看问题是否消失。但这不会真正帮助我。不能立即升级 Tomcat。
    【解决方案4】:

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

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

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

    据我所知,可以让您执行此操作的一个应用服务器是Spring's DM server。这是他们正在增强的 Tomcat 的一个分支。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-14
      • 2013-05-28
      • 1970-01-01
      • 2016-06-25
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      相关资源
      最近更新 更多