Organizational Research By

Surprising Reserch Topic

adding files to java classpath at runtime


adding files to java classpath at runtime  using -'Is,it,possible,to,add,a,file,(not,necessarily,a,jar,file),to,java,classpath,at,runtime.
Specifically,,the,file,already,is,present,in,the,classpath,,what,I,want,is,whether,I,can,add,a,modified,copy,of,this,file,to,the,classpath.

Thanks,'

asked Sep 21, 2015 by bhavin
edited Sep 21, 2015 by rajesh
0 votes
8 views



Related Hot Questions

7 Answers

0 votes

You can only add folders or jar files to a class loader. So if you have a single class file, you need to put it into the appropriate folder structure first.

Here is a rather ugly hack that adds to the SystemClassLoader at runtime:

import java.io.IOException;
import java.io.File;
import java.net.URLClassLoader;
import java.net.URL;
import java.lang.reflect.Method;

public class ClassPathHacker {

private static final Class[] parameters = new Class[]{URL.class};

public static void addFile(String s) throws IOException {
   File f = new File(s);
   addFile(f);
}//end method

public static void addFile(File f) throws IOException {
   addURL(f.toURL());
}//end method


public static void addURL(URL u) throws IOException {

  URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
  Class sysclass = URLClassLoader.class;

  try {
     Method method = sysclass.getDeclaredMethod("addURL", parameters);
     method.setAccessible(true);
     method.invoke(sysloader, new Object[]{u});
  } catch (Throwable t) {
     t.printStackTrace();
     throw new IOException("Error, could not add URL to system classloader");
  }//end try catch

   }//end method

}//end class

The reflection is necessary to access the protected method addURL. This could fail if there is a SecurityManager.

answered Sep 21, 2015 by okesh.badhiye
0 votes

Try this one on for size.

private static void addSoftwareLibrary(File file) throws Exception {
    Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
    method.setAccessible(true);
    method.invoke(ClassLoader.getSystemClassLoader(), new Object[]{file.toURI().toURL()});
}

This edits the system class loader to include the given library jar. It is pretty ugly, but it works.

answered Sep 21, 2015 by patilkiran.101
0 votes

The way I have done this is by using my own class loader

URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
DynamicURLClassLoader dynalLoader = new DynamicURLClassLoader(urlClassLoader);

And create the following class:

public class DynamicURLClassLoader extends URLClassLoader{

public DynamicURLClassLoader(URLClassLoader classLoader) {
    super(classLoader.getURLs());

}

@Override
public void addURL(URL url) {
    super.addURL(url);
}

}

Works without any reflection

answered Sep 21, 2015 by gauravsinghal83
0 votes

yes, you can. it will need to be in its package structure in a separate directory from the rest of your compiled code if you want to isolate it. you will then just put its base dir in the front of the classpath on the command line.

answered Sep 21, 2015 by vimaldas2005
0 votes

You coud try java.net.URLClassloader with the url of the folder/jar where your updated class resides and use it instead of the default classloader when creating a new thread.

answered Sep 21, 2015 by sanjaypal1983
0 votes

Yes I believe it's possible but you might have to implement your own classloader. I have never done it but that is the path I would probably look at.

answered Sep 21, 2015 by amit_cmps
0 votes

My solution:

File jarToAdd = new File("/path/to/file");

new URLClassLoader(((URLClassLoader) ClassLoader.getSystemClassLoader()).getURLs()) {
    @Override
    public void addURL(URL url) {
         super.addURL(url);
    }
}.addURL(jarToAdd.toURI().toURL());
answered Sep 21, 2015 by okesh.badhiye

...