如何使用单独的jar覆盖类?

时间:2009-01-19 17:57:08

标签: java class jar override aspectj

客户需要预览我们产品的新功能。他们要求在jar文件(如补丁)中将这个功能发送给他们。在所述jar文件中包含新类没有问题。但是,修改了现有类,这是集成新功能所必需的。他们只想添加这个新的jar文件,而无需更新我们产品的核心类。所以,问题是:是否可以使用单独的jar覆盖已存在的类?如果是这样,怎么样?

提前致谢。

5 个答案:

答案 0 :(得分:11)

如果你把新jar放在类路径中而不是原来的jar,那么机会它会起作用。这值得尝试,虽然它仍然听起来像是灾难的秘诀 - 或者至少,如果两个类都被加载,很难调试问题。

编辑:我本来打算早点写这个,但是在火车旅行结束时被打断了......

我会回到客户那里解释一下,虽然他们所要求的是可能的,但可能会导致意想不到的问题。更新jar文件是一个更安全的解决方案,风险更低。短语“意外问题”和“风险”可能会给客户敲响警钟,所以希望他们能让你做正确的事。

答案 1 :(得分:3)

是和否,这取决于您的环境。

如果您使用OSGi并且您的版本受到控制,那么只需要在更高版本中安装带有导出包的新捆绑(假设您的版本范围足够宽松)。

如果您使用普通的旧Java而没有花哨的自定义类加载,那么您最好先将它放在类路径上(正如其他人已提到的那样)。

如果你有自定义类加载,你需要确保你的'patched'类需要的所有类,以及整个传递依赖性hull,从加载修补版本的类加载器中可见,这可能意味着你需要运送整个应用程序,最糟糕的情况。

答案 2 :(得分:2)

规定将更新的类放在类路径中替换它们之前的所有答案都是正确的, 仅提供 原始JAR未密封或签名。

答案 3 :(得分:1)

是的,可以通过将它放在类路径上而不是原始jar来实现。但是,依靠类路径的顺序并不总能带来快乐。我不确定它是否甚至记录在Java语言规范中;如果没有,那么它将为不同的JVM甚至同一JVM的不同版本打破。

相反,请考虑引用一个现实的时间框架,将新功能集成到当前的代码库中。这可能不是您正在寻找的答案。

答案 4 :(得分:0)

对于这个特定情况,可能比您需要的更多,但通常如果您只想调整或扩充现有类,您也可以将AspectJ与load-time weaving一起使用。