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

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

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

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

在Eclipse中,简单的解决方案是右键单击您的项目 ,单击属性 > Java内置路径 > 顺序和导出,然后将Foo-2.0.jar移到Bar-2.0.jar之上,以便首先解决它。

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

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

Tomcat 5的 webapps 类加载优先级大致如下:首先是bootstrap / system( JRE/lib ,然后是Tomcat的内部类),然后是webapp库(首先是WEB-INF/classes ,然后是WEB-INF/lib ),然后是常见的库(首先是Tomcat/common ,然后是Tomcat/lib ),最后是webapp-shared库( Tomcat/shared )。

因此,要 Bar-2.0.jar 之前加载Foo-2.0.jar ,最好的办法是将Bar-2.0.jarWEB-INF/libTomcat/commonTomcat/shared

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

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

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

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

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

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

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