Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Tomcat5上控制WEB-INF/lib中JAR的类路径顺序?_Java_Tomcat_Jar_Classpath - Fatal编程技术网

Java 在Tomcat5上控制WEB-INF/lib中JAR的类路径顺序?

Java 在Tomcat5上控制WEB-INF/lib中JAR的类路径顺序?,java,tomcat,jar,classpath,Java,Tomcat,Jar,Classpath,我有一个运行在Tomcat 5.0中的传统web应用程序 这个web应用程序在web-INF/lib中有两个jar,比如说Foo-2.0.jar和Bar-2.0.jarBar-2.0.jar实际上包含一个Foo-1.0.jar。Bar也是一个死项目,意味着没有升级,没有源代码,但对应用程序仍然很重要 这个应用程序的最新版本需要Foo-2.0.jar来处理其他一些东西。在类路径中同时使用Foo-1.0.jar和Foo-2.0.jar会产生冲突,特别是ClassDefNotFound类型的错误,在1

我有一个运行在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类型的错误,在1.0中找不到后来在2.0中添加的类,等等

在Eclipse中,简单的解决方案是右键单击您的项目,单击Properties>Java Build Path>Order and Export,然后将Foo-2.0.jar移动到Bar-2.0.jar上方,以便首先解决它


如何在Tomcat中为WEB-INF/lib中的JAR完成这种类型的类路径排序?

您没有,因为这个特性在Tomcat中不可用。如果类路径中同时需要Foo-1.0.jar和Foo-2.0.jar,则需要一些主要的类路径重组


如果Bar-2.0可以与Foo-2.0一起工作,那么最好的办法就是自己重新构建Bar-2.0,而不在其中使用Foo-1.0.jar。

Bar-2.0.jar中剥离Foo-1.0.jar。事实上,无论是开发(需要修改开发环境)还是部署,都很难做到这一点。

可以在jar的mainfest中设置类路径。
我不能保证它会解决这个问题,但值得一试。

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

对于webapps,大致如下:首先是引导程序/系统(
JRE/lib
,然后是Tomcat的内部类),然后是webapp库(首先是
WEB-INF/classes
,然后是
WEB-INF/lib
),然后是公共库(首先是
Tomcat/common
,然后是
Tomcat/lib
),最后是webapp共享库(
Tomcat/shared

因此,要在
Bar-2.0.jar
之前加载
Foo-2.0.jar
,最好的方法是将
Bar-2.0.jar
WEB-INF/lib
移动到
Tomcat/common
Tomcat/shared


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

将Foo-1.0.JAR放在$CATALINE\u HOME/common/annowed(或者放在Foo-2.0.JAR之后加载它的任何其他地方).

要在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的内容也会得到同样的效果。

无法知道Bar-2.0是否与Foo-2.0一起工作,而且它是一个庞大的、只有二进制文件的库,没有测试用例。我相信您使用的解决方案中有Bar-2.0与Foo一起运行-2.0,只是以一种迂回的方式。乔治先回答了,所以我接受了他的意见,但你所描述的正是我为解决问题所做的。你的链接特别有用。我鼓励大家投票支持这个答案。不客气。尽管我要指出,这里的答案不是默认按答案日期排序的。在写作预兆您可以在用户头像的右上角看到我23分钟前回答了这个问题,Georgy 15分钟前回答了这个问题。您可以通过三个选项卡之一更改排序,分别是
最旧的
最新的
投票
答案的右上角。默认值是
投票
。在工具提示中,您可以看到xact时间。所以我实际上是第一个:我真的认为这是最好的建议。重新打包你的bar-2.0.jar,否则你只会让你头疼。