Java 引用特定jar文件中的类
在我的程序中,我陷入了相当尴尬的境地。 情况是。。。我的项目在类路径中有一些A.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
是一个非常旧的文件,我们无法替换它,因为我们不确定它的重要性和作用。。。。
现在,我需要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首先放在类路径中,然后放在其他文件中解决了这个问题。。。