Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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_Class_Jar_Overriding_Aspectj - Fatal编程技术网

Java 如何使用单独的jar重写类?

Java 如何使用单独的jar重写类?,java,class,jar,overriding,aspectj,Java,Class,Jar,Overriding,Aspectj,客户需要预览我们产品的新功能。他们要求将该特性以jar文件(如补丁)的形式发送给他们。在所述jar文件中包含新类没有问题。但是,修改了一个现有类,这是集成新特性所必需的。他们只想添加这个新的jar文件,而不必更新我们产品的核心类。所以,问题是:是否可以使用单独的jar覆盖已经存在的类?如果是,怎么做 提前感谢。如果您将新jar放在类路径中的时间早于原始jar,那么它可能会起作用。这是值得尝试的,尽管它听起来仍然像是一个灾难的配方——或者至少,如果两个类都加载了,那么调试问题确实很难 编辑:我本打

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

提前感谢。

如果您将新jar放在类路径中的时间早于原始jar,那么它可能会起作用。这是值得尝试的,尽管它听起来仍然像是一个灾难的配方——或者至少,如果两个类都加载了,那么调试问题确实很难

编辑:我本打算早点写这篇文章的,但在火车旅行结束时被打断了


我会回到客户那里,向他们解释,虽然他们提出的问题是可能的,但可能会导致意想不到的问题。更新jar文件是一种更安全的修复方法,风险更小。“意外问题”和“风险”这两个短语很可能会给客户敲响警钟,因此希望他们能让你做正确的事情。

是的,这是可能的,将它放在类路径上比原来的jar更早。然而,依赖类路径的顺序并不总是能带来快乐。我不确定它是否在Java语言规范中有文档记录;如果不是的话,那么对于不同的JVM,甚至同一JVM的不同版本,它都会崩溃


取而代之,考虑引用一个现实的时间框架来将新的特征集成到当前的代码库中。这可能不是你想要的答案。

是和否,这取决于你的环境

例如,如果您使用OSGi并控制您的版本,那么只需在更高版本(假设您的版本范围足够宽松)的导出包中安装一个新的捆绑包即可

如果您使用的是普通的旧Java,而没有奇特的自定义类加载,那么最好将其放在类路径的前面(正如其他人已经提到的)


如果您确实有自定义类加载,则需要确保您的“修补”类所需的所有类,以及整个可传递依赖外壳,都可以从加载修补版本的类加载程序中看到,这可能意味着您需要发布整个应用程序,最坏的情况。

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

可能超出了此特定情况的需要,但一般来说,如果您只想调整或扩充现有类,也可以使用AspectJ

根据我的经验,类路径中早期的类是可靠加载的,而后期的版本则不是。是的,它应该可以工作,但它仍然是一种相当愚蠢的方法来更新一些类,并且对更改的接口的依赖可能仍然会烧坏你。此外,如果没有更新所有涉及的类路径,复杂的类加载器结构甚至可能导致类加载失败。如果这是部署更新的计划方法,请非常小心使用长类路径。有些平台对命令行的长度有限制。我认为现代操作系统相对较长,但可能有256或1024个字符。总之,您可以在类路径中较早地为临时补丁设置类,但不应将其用作永久解决方案,因为链接类和接口的进一步开发和更改可能会产生意想不到的问题。