Organizational Research By

Surprising Reserch Topic

how to adding a 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 16, 2015 by suyesh.lokhande
edited Sep 16, 2015 by rajesh
0 votes
5 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 16, 2015 by shikhar jain
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 16, 2015 by manju bhargava
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 16, 2015 by tushar2k6
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 16, 2015 by tushar2k6
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 16, 2015 by shikhar jain
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 16, 2015 by suyesh.lokhande
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 16, 2015 by abhi

...