【问题标题】:Override class in java覆盖java中的类
【发布时间】:2015-11-20 19:00:57
【问题描述】:

假设我有一个项目K

K取决于lib.jar

lib.jar中,有一个类名为x.y.z.Foo

如果我在 K 中创建相同的类 x.y.z.Foo ,那么在这个项目中,当我创建 Foo 的实例时,现在 JVM 将在 K 中使用 Foo strong> 而不是 lib.jar


如果它不稳定或依赖于某些东西,如何确保Foo应该使用K的版本而不是lib.jar

【问题讨论】:

  • 这取决于在类路径中哪个是第一个以及它在哪里被实例化。您可以查看自定义类加载器来解决这个问题。
  • 听起来您正在寻找一扇通往痛苦世界的大门,如果不是为自己,那么为以后可能不得不处理您的代码的人。您应该花一些时间阅读这篇文章,或者考虑使用 OSGi 或类似的东西,即使只是创建一个大型捆绑包。如果您决定走自己的路,您应该研究一条类似的井道,以了解可能会出现什么样的意外颠簸(在一个地方获得正确的版本可能只是一小步)。
  • 这就是JAR Hell 的意义所在。
  • @jackalope 运行时性能完全不会受到构建/加载时间编织的影响,只有在适当的运行时编织时才会受到轻微影响。如果做得好,维护很大程度上就是 AOP 的全部内容(即使这不是它的预期用途,可维护性也不会改变)。 AOP 在像 Spring 这样的轻量级框架中的广泛使用证明了这两个方面。从您的角度来看,这显然不是一个可行的答案,但其他人可以考虑这个问题。

标签: java overriding classloader


【解决方案1】:

独立应用程序(至少没有自定义类加载器)中的 Java 类加载行为是稳定的。确保您的 k.jar(或路径)位于 -cp java arg 中的 lib.jar 之前

java -cp k.jar lib.jar ...

或将依赖项添加到您的 K 项目的 /META-INF/MANIFEST.MF 为

...
Class-Path: lib1.jar lib2.jar
...

然后运行

java -jar k.jar

k.jar 类将首先加载

在 Maven 中是

<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
         ...

【讨论】:

  • 如何用 maven 做到这一点?
  • 如何在 Android 中做到这一点?
  • 如何用 SBT 做到这一点?
猜你喜欢
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多