2010-01-07 69 views
8

我有一个在Tomcat 5.0中运行的遗留Web应用程序。控制Tomcat 5上WEB-INF/lib中jar包的类路径排序?

此Web应用程序在WEB-INF/lib目录两瓶,让我们说富-2.0.jar酒吧-2.0.jarBar-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中,简单的解决方法是右击你的项目,单击属性>Java的内置路径>订单和出口和移动富-2.0.jar以上酒吧, 2.0.jar所以先解决了。

如何在Tomcat中完成WEB-INF/lib这种罐式类路径排序?

回答

3

将Foo-1.0.jar放置到$ CATALINE_HOME/common/endorsed(或其他将在Foo-2.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

没有办法知道Bar-2.0是否可以与Foo-2.0一起使用,它是一个没有测试用例的大型二进制库。 – rcampbell 2010-01-07 15:48:42

+0

我相信你使用的解决方案是使用Foo-2.0运行的Bar-2.0,只是以一种迂回的方式。 – jsight 2010-01-08 15:09:42

4

Strip Foo-1.0.jar Out of Bar-2.0.jar。事实上,只是在开发(需要对开发环境进行虚拟化)和部署两方面都遇到麻烦。

+0

我真的认为这是最好的建议。重新包装你的酒吧-2.0.jar,否则你只是要求头痛的道路。 – 2010-05-17 19:09:31

-2

这有点冒险,但可能工作。将Foo-2.0.jar的名称更改为Bar-2.0.jar的字母顺序,比如说AFoo-2.0.jar。

32

Tomcat 5's classloading precedence用于web应用是大致如下:第一引导/系统(JRE/lib,然后Tomcat的内部类),则web应用程序库(第一WEB-INF/classes,然后WEB-INF/lib),则公共库(第一Tomcat/common,然后Tomcat/lib)和最后是webapp共享库(Tomcat/shared)。

因此,要获得Foo-2.0.jarBar-2.0.jar加载,最好你可以做的是从WEB-INF/lib移动Bar-2.0.jarTomcat/commonTomcat/shared

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

+0

乔治首先回答,所以我接受了他的提交,但是你描述的正是我所做的解决问题的方法。您的链接特别有用。 **我鼓励大家把这个答案投给**。 – rcampbell 2010-01-07 16:49:45

+1

不客气。虽然我会指出,答案在这里是**,而不是默认按答复日期排序。在撰写本文时,您可以在用户头像的右上角看到我23分钟前回答了这个问题,15分钟前回复了Georgy。您可以通过答案右上方的三个选项卡中的一个选项来更改排序顺序:“最旧”,“最新”和“投票”。默认值是'votes'。 – BalusC 2010-01-07 17:00:19

+1

而且,在工具提示中,您可以看到确切的时间。所以我实际上是第一个:o – BalusC 2010-01-07 17:33:56