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

问题描述 投票:8回答:7

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

这个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类型的错误,其中稍后在2.0中添加的类无法在1.0中找到,等等。

在Eclipse中,简单的解决方案是右键单击您的Project,单击Properties> Java Built Path> Order and Export并将Foo-2.0.jar移到Bar-2.0.jar之上,以便首先解析它。

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

java tomcat jar classpath
7个回答
3
投票

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


33
投票

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

因此,为了在Foo-2.0.jar之前加载Bar-2.0.jar,最好的办法是将Bar-2.0.jarWEB-INF/lib移动到Tomcat/commonTomcat/shared

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


4
投票

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


1
投票

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

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


0
投票

可以在jar的清单中设置Class-Path。 qazxsw poi我真的不能保证会解决这个问题,但值得一试。


0
投票

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

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


-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.