在Tomcat 5上控制WEB-INF / lib中jar的类路径排序?

时间:2010-01-07 15:12:18

标签: java tomcat jar classpath

我有一个在Tomcat 5.0中运行的遗留Web应用程序。

这个网络应用程序在 WEB-INF / lib 中有两个jar,假设 Foo-2.0.jar Bar-2.0.jar Bar-2.0.jar 实际上包含了 Foo-1.0.jar 。 Bar也是一个死的项目,意味着没有升级,没有来源,但对应用程序仍然很重要。

此应用程序的最新版本需要 Foo-2.0.jar 来处理其他一些内容。在类路径中同时包含 Foo-1.0.jar Foo-2.0.jar 会产生冲突,特别是 ClassDefNotFound 类型的错误,其中a后来在2.0中添加的类在1.0等中找不到。

在Eclipse中,简单的解决方案是右键单击 Project ,单击 Properties > Java Built Path > 订购和导出并将 Foo-2.0.jar 移到 Bar-2.0.jar 上方,以便先解决。

如何在Tomcat中的 WEB-INF / lib 中为jar实现这种类型的路径排序?

7 个答案:

答案 0 :(得分:33)

webapps的

Tomcat 5's classloading precedence大致如下:首先是bootstrap / system(JRE/lib,然后是Tomcat的内部类),然后是webapp库(第一个WEB-INF/classes,然后是{{1} }),然后是公共库(首先是WEB-INF/lib,然后是Tomcat/common),最后是webapp共享库(Tomcat/lib)。

为了在 Tomcat/shared之前加载Foo-2.0.jar ,最好的办法是将Bar-2.0.jarBar-2.0.jar移到WEB-INF/lib }或Tomcat/common

JAR未按名称的字母顺序加载。至少,没有规范说明这一点。重命名它们以更改按字母顺序排列的文件名顺序是没有意义的。

答案 1 :(得分:4)

Bar-2.0.jar 中删除 Foo-1.0.jar 。事实上,等待开发(需要捏造开发环境)和部署都很麻烦。

答案 2 :(得分:3)

将Foo-1.0.jar放到$ CATALINE_HOME / common / endorsed(或在Foo-2.0.jar之后加载它的任何其他地方)。

答案 3 :(得分:1)

您没有,因为Tomcat中没有此功能。如果同时在类路径中同时需要Foo-1.0.jar和Foo-2.0.jar,则需要进行一些主要的类路径重组。

如果Bar-2.0可以与Foo-2.0一起使用,那么最好的办法就是在没有Foo-1.0.jar的情况下自己重建Bar-2.0。

答案 4 :(得分:0)

可以在jar的清单中设置Class-Path。 http://java.sun.com/developer/Books/javaprogramming/JAR/basics/manifest.html 我不能保证它会解决问题,但值得一试。

答案 5 :(得分:0)

要在Bar-2.0.jar之前使用Foo-2.0.jar,请使用Foo-2.0.jar的内容更新Bar-2.0.jar(覆盖已包含的.class)并从战争中删除Foo-2.0.jar

-cp A.jar:B.jar有效,A.jar的内容就像B.jar上的一层。所以你可以用A.jar的覆盖B.jar的内容获得同样的效果。

答案 6 :(得分:-2)

这有点hacky但可能有用。将Foo-2.0.jar的名称改为按字母顺序排在Bar-2.0.jar之前,比如AFoo-2.0.jar。