Search code examples
javaoverridingclassloader

Override class in java


Assume I have a project K

K depends lib.jar

In lib.jar , there is a class named x.y.z.Foo

If i create the same class x.y.z.Foo in K , then in this project when I create a instance of Foo , now will JVM use Foo in K rather than in lib.jar ?


And if it's unstable or depends on something , how to make sure that Foo should use K's version rather than lib.jar?


Solution

  • Java class loading behaviour in a standalone application (at least with no custom classloaders) is stable. Make sure that your k.jar (or path) comes before lib.jar in -cp java arg

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

    or add dependencies to /META-INF/MANIFEST.MF of your K project as

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

    and run

    java -jar k.jar
    

    k.jar classes will be loaded first

    in Maven it is

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