[Info-vax] Versioning fun

Arne Vajhøj arne at vajhoej.dk
Wed Mar 27 11:03:57 EDT 2024


On 3/27/2024 10:30 AM, Single Stage to Orbit wrote:
> On Wed, 2024-03-27 at 09:11 -0400, Arne Vajhøj wrote:
>> $ java "TestX"
>> Technically I am a X, but I am version 1
>> Technically I am a X, but I am version 2
> 
> It is vital to delete the X.class files otherwise it will load that
> instead of the jar files.

Yes. I should probably have mentioned that explicit.

Java class loaders are hierarchical and searched top down. The
default class loader with default classpath of current directory
is searched before the jar files in the special class loaders.

$ type Dump.java
import java.io.File;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;
import java.util.ArrayList;

public class Dump {
     private static void dump(String lbl, ClassLoader cl) {
         List<ClassLoader> lst = new ArrayList<ClassLoader>();
         ClassLoader cl1 = cl;
         do {
             lst.add(cl1);
             cl1 = cl1.getParent();
         } while(cl1 != null);
         System.out.printf("Class search path for %s:\n", lbl);
         for(int i = lst.size() - 1; i >= 0; i--) {
             System.out.printf("  %d - %s", lst.size() - i, 
lst.get(i).getClass().getName());
             if(lst.get(i) instanceof URLClassLoader) {
                 System.out.print(" -");
                 for(URL url : ((URLClassLoader)lst.get(i)).getURLs()) {
                     System.out.printf(" %s", url);
                 }
             }
             System.out.println();
         }
     }
     public static void main(String[] args) throws Exception {
         dump("Default", Dump.class.getClassLoader());
         ClassLoader v1 = new URLClassLoader(new URL[] { (new 
File("v1.jar")).toURI().toURL() });
         dump("V1 library", v1);
         ClassLoader v2 = new URLClassLoader(new URL[] { (new 
File("v2.jar")).toURI().toURL() });
         dump("V2 library", v2);
     }
}
$ javac Dump.java
$ java Dump
Class search path for Default:
   1 - sun.misc.Launcher$ExtClassLoader - 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/cldrdata.jar 
file:/DISK$X86SYS/SYS0
/SYSCOMMON/openjdk$80/jre/lib/ext/dnsns.jar 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/jaccess.jar 
file:/DISK$X86SYS/SY
S0/SYSCOMMON/openjdk$80/jre/lib/ext/localedata.jar 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/nashorn.jar 
file:/DISK$X8
6SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/sunec.jar 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/sunjce_provider.jar 
fil
e:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/sunpkcs11.jar 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/zipfs.jar
   2 - sun.misc.Launcher$AppClassLoader - file:/DISK2/ARNE/
Class search path for V1 library:
   1 - sun.misc.Launcher$ExtClassLoader - 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/cldrdata.jar 
file:/DISK$X86SYS/SYS0
/SYSCOMMON/openjdk$80/jre/lib/ext/dnsns.jar 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/jaccess.jar 
file:/DISK$X86SYS/SY
S0/SYSCOMMON/openjdk$80/jre/lib/ext/localedata.jar 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/nashorn.jar 
file:/DISK$X8
6SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/sunec.jar 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/sunjce_provider.jar 
fil
e:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/sunpkcs11.jar 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/zipfs.jar
   2 - sun.misc.Launcher$AppClassLoader - file:/DISK2/ARNE/
   3 - java.net.URLClassLoader - file:/DISK2/ARNE/v1.jar
Class search path for V2 library:
   1 - sun.misc.Launcher$ExtClassLoader - 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/cldrdata.jar 
file:/DISK$X86SYS/SYS0
/SYSCOMMON/openjdk$80/jre/lib/ext/dnsns.jar 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/jaccess.jar 
file:/DISK$X86SYS/SY
S0/SYSCOMMON/openjdk$80/jre/lib/ext/localedata.jar 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/nashorn.jar 
file:/DISK$X8
6SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/sunec.jar 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/sunjce_provider.jar 
fil
e:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/sunpkcs11.jar 
file:/DISK$X86SYS/SYS0/SYSCOMMON/openjdk$80/jre/lib/ext/zipfs.jar
   2 - sun.misc.Launcher$AppClassLoader - file:/DISK2/ARNE/
   3 - java.net.URLClassLoader - file:/DISK2/ARNE/v2.jar

Arne




More information about the Info-vax mailing list