在Tomcat 5上控制WEB-INF / lib中jar的类路径排序?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Tomcat 5上控制WEB-INF / lib中jar的类路径排序?相关的知识,希望对你有一定的参考价值。
我有一个在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实现这种类型的路径排序?
将Foo-1.0.jar放到$ CATALINE_HOME / common / endorsed(或者在Foo-2.0.jar之后将加载它的任何其他位置)。
用于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.jar
从WEB-INF/lib
移动到Tomcat/common
或Tomcat/shared
。
JAR未按名称的字母顺序加载。至少,没有规范说明这一点。重命名它们以更改按字母顺序排列的文件名顺序是没有意义的。
从Bar-2.0.jar中剥离Foo-1.0.jar。事实上,等待开发(需要捏造开发环境)和部署都很麻烦。
您没有,因为Tomcat中没有此功能。如果同时在类路径中同时需要Foo-1.0.jar和Foo-2.0.jar,则需要进行一些主要的类路径重组。
如果Bar-2.0可以与Foo-2.0一起使用,那么最好的办法就是在没有Foo-1.0.jar的情况下自己重建Bar-2.0。
可以在jar的清单中设置Class-Path。 qazxsw poi我真的不能保证会解决这个问题,但值得一试。
要在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的内容会得到同样的效果。
这有点hacky但可能会奏效。将Foo-2.0.jar的名称改为按字母顺序排在Bar-2.0.jar之前,比如说AFoo-2.0.jar。
以上是关于在Tomcat 5上控制WEB-INF / lib中jar的类路径排序?的主要内容,如果未能解决你的问题,请参考以下文章
在tomcat类路径中包含web-inf / lib中的目录
Tomcat 6 未从 WEB-INF/lib 加载 jars