我的程序中一直处于非常尴尬的境地。
案例是......我的项目在classpath中有一些A.jar文件包含许多重要的实用程序类..但是这个A.jar
是一个非常古老的文件,我们无法替换它,因为我们不知道如何以及如何它的重要性......
现在,我需要方法request.setCharacterencoding()
&来自ServletResponse I / F的response.setCharacterEncoding
,但A.jar
包含ServletResponse
的旧版本,因此我没有得到上述两种方法。现在我引入了新的servlet-api.jar
在classpath中,但我的项目仍然是servletRespons
来自A.jar
而不是新servlet-api.jar
的引用。
请问各位,请建议我从servletResponse
而非A.jar
servlet-api.jar
的参考资料
(P.s。:我不能删除/修改A.jar)
...谢谢
答案 0 :(得分:4)
运行jar文件时,使类路径反映您要加载的jar的顺序。如果你需要确切的语法,请告诉我,但一般情况下,如果你有CLASSPATH = patch16.jar:patch15.jar:patch14.jar:...等,它将加载该类的第一个匹配副本,从patch16开始.jar然后patch15.jar等。
有关确切语法的更多信息: http://javarevisited.blogspot.com/2011/01/how-classpath-work-in-java.html
答案 1 :(得分:1)
将servlet-api.jar放在类路径中的A.jar之前。
但是,你的问题并没有全部解决! A.jar中的内容如果需要Servlet API的旧实现,但新的实现已经加载了怎么办?或者当其他人没有相同顺序的类路径时会发生什么?
你可能最好解压缩A.jar并将其重新打包为A-modified.jar
答案 2 :(得分:1)
实际上,JVM按顺序尝试从列表中的资源加载它们。例如,如果您的类路径看起来像new.jar;old.jar
,并且两个jar都具有相同类的不同版本,则将使用new.jar
中的版本。
请注意,如果你在Unix上使用:
而不是;
。
但我可以表达我的怀疑。你的项目听起来有些不对劲。为什么自定义jar中有ServletRequest
?我应该使用标准j2ee.jar
或类似的东西来获得这种标准类。据我所知,在过去的12年中,只有一种方法从servlet API中删除:能够执行servlet到servlet的通信。这发生在大约10年前。因此,如果您使用的是最新版本的标准servlet API,那么包括旧代码在内的一切都应该有效。
答案 3 :(得分:0)
简单的解决方案,如果这两个ServletRqquest位于不同的包中,则不要导入旧版本,而是使用完整的包名访问它。 或者你必须编写自己的类加载来加载该jar。
答案 4 :(得分:0)
我看到的唯一方法是获取或创建ClassLoader
,然后将您的类内容作为字节数组,然后加载您的类。
答案 5 :(得分:0)
如果没有做任何特别的事情,你就会被搞砸了:按照类路径中的顺序加载类。
但是,您可以编写一个自定义ClassLoader
,可以对您需要的类采取特殊操作,特别是在这种情况下从ServletResponse
加载servlet-api.jar
,否则A.jar
在 servlet-api.jar
P.S。找出谁创建了一个具有与ServletRequest相同的包和名称的类并杀死它们。