Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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 引用特定jar文件中的类_Java_Jar_Conflict - Fatal编程技术网

Java 引用特定jar文件中的类

Java 引用特定jar文件中的类,java,jar,conflict,Java,Jar,Conflict,在我的程序中,我陷入了相当尴尬的境地。 情况是。。。我的项目在类路径中有一些A.jar文件,其中包含许多重要的实用程序类。但是这个A.jar是一个非常旧的文件,我们无法替换它,因为我们不确定它的重要性和作用。。。。 现在,我需要ServletResponse i/F中的方法request.setCharacterencoding()&response.setCharacterencoding,但是这个A.jar包含了ServletResponse的旧版本,因此我无法获得上述两种方法。。现在我已经

在我的程序中,我陷入了相当尴尬的境地。 情况是。。。我的项目在类路径中有一些A.jar文件,其中包含许多重要的实用程序类。但是这个
A.jar
是一个非常旧的文件,我们无法替换它,因为我们不确定它的重要性和作用。。。。 现在,我需要ServletResponse i/F中的方法
request.setCharacterencoding()
&
response.setCharacterencoding
,但是这个
A.jar
包含了
ServletResponse
的旧版本,因此我无法获得上述两种方法。。现在我已经在类路径中引入了新的
ServletAPI.jar
,但我的项目仍然从
A.jar
引用
ServletResponse
e类,而不是从新的
ServletAPI.jar
引用

你们能不能建议我一种方法,从
servlet api.jar
而不是.jar获取新的
servletResponse
的引用

(注意:我不能删除/修改A.jar)


谢谢…

当您运行jar文件时,让类路径反映您想要加载的jar的顺序。如果您需要精确的语法,请告诉我,但一般来说,如果您有CLASSPATH=patch16.jar:patch15.jar:patch14.jar:。。。等等,它将加载类的第一个匹配副本,从patch16.jar开始,然后是patch15.jar等等

有关确切语法的详细信息:
简单的解决方案,如果这两个ServletRqquest在不同的包中,只需不导入旧包,而是使用完整的包名访问它。
或者你必须编写自己的类装入程序来装入这个jar。

我看到的唯一方法是获取或创建一个
类装入程序,然后将类的内容作为字节数组,然后装入类。

如果不做任何特殊的事情,你就会被搞糟:类是按照在类路径中找到的顺序装入的

但是,您可以编写一个定制,为您需要的类执行特殊操作,特别是在本例中,从
servlet api.jar
加载
ServletResponse
,否则在
servlet api.jar
之前的类路径中有
a.jar


p、 找出创建与ServletRequest具有相同包和名称的类的人,并杀死他们。

让servlet-api.jar位于类路径中的a.jar之前

然而,你的问题并没有全部解决!如果A.jar中的某些内容需要旧的ServletAPI实现,但新的实现已经加载,那么该怎么办?或者当其他人的类路径顺序不一致时会发生什么


您最好解压缩一个.jar并将其重新打包为一个经过修改的.jar。实际上,JVM会按顺序查找类,尝试从列表中的资源中加载它们。例如,如果类路径看起来像
new.jar;旧的.jar
和两个jar具有相同类的不同版本,将使用
new.jar
中的版本

请注意,如果您在Unix上,请使用
而不是


但请允许我表示我的怀疑。你的项目听起来有点不对劲。为什么自定义jar中有
ServletRequest
?我应该使用标准的
j2ee.jar
或类似的东西来获取这种标准类。据我所知,在过去的12年中,只有一种方法从ServletAPI中被删除:实现servlet到servlet通信的能力。这发生在大约10年前。因此,如果您使用的是最新版本的标准servlet API,那么包括旧代码在内的所有内容都应该可以正常工作。

您可以使用自定义类加载器,并使用该加载器从servlet API加载类,然后从中获取类。不过,这可能很难靠你自己做到。如果您在应用程序服务器(例如JBoss、Websphere、Glassfish等)上运行,您可以研究它的类加载策略如何支持您。这个问题可能会帮助您:或者这个问题:-1这没有回答问题:重新排列类路径没有帮助,因为存在交叉依赖,所以无论如何,您都必须重新编译代码。(或者确保在新jar中用新类覆盖所有旧类,以避免任何依赖性问题)。另外,可以在开始脚本中设置类路径以保持可移植性。这一点你完全没有抓住。设置类路径永远无法解决这个问题,因为他希望从A.jar和B.jar获得两个jar所共有的一些类。逻辑告诉您,无论您如何设置类路径,您永远无法满足这个要求。实际上,您也不必重新编译(java动态链接…这就是他有这个问题的原因),但您必须为JVM提供一个自定义类加载器-这将涉及到重新编译,但仅限于自定义类加载器。感谢Flwyd,但正如我前面提到的。。我无法修改A.jarHi Alex,因为该项目非常旧,其中包含许多其他小模块,因此可能是出于此目的,他们创建了这个A.jar,其中包含所有实用程序类。(仍然我不确定)感谢大家的快速建议。。最后,我通过将servlet-api.jar首先放在类路径中,然后放在其他文件中解决了这个问题。。。