从特定的jar文件中引用一个类

时间:2011-12-20 08:02:58

标签: java jar conflict

我的程序中一直处于非常尴尬的境地。 案例是......我的项目在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)

...谢谢

6 个答案:

答案 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.jarservlet-api.jar

之前的类路径

P.S。找出谁创建了一个具有与ServletRequest相同的包和名称的类并杀死它们。