Can a directory be added to the class path at runtime?

前端 未结 3 1818
执念已碎
执念已碎 2020-12-01 03:50

In order to better understand how things works in Java, I\'d like to know if I can dynamically add, at runtime, a directory to the class path.

For example, if I laun

相关标签:
3条回答
  • 2020-12-01 03:57

    Yes, you can use URLClassLoader.. see example here. Doesn't use reflection.

    -- edit --

    Copying example from the link as suggested.

    import javax.naming.*;
    import java.util.Hashtable;
    import java.net.URLClassLoader;
    import java.net.URL;
    import java.net.MalformedURLException;
    
    public class ChangeLoader {
    
        public static void main(String[] args) throws MalformedURLException {
        if (args.length != 1) {
            System.err.println("usage: java ChangeLoader codebase_url");
            System.exit(-1);
        }
    
        String url = args[0];
        ClassLoader prevCl = Thread.currentThread().getContextClassLoader();
    
        // Create class loader using given codebase
        // Use prevCl as parent to maintain current visibility
        ClassLoader urlCl = URLClassLoader.newInstance(new URL[]{new URL(url)}, prevCl);
    
            try {
            // Save class loader so that we can restore later
                Thread.currentThread().setContextClassLoader(urlCl);
    
            // Expect that environment properties are in
            // application resource file found at "url"
            Context ctx = new InitialContext();
    
            System.out.println(ctx.lookup("tutorial/report.txt"));
    
            // Close context when no longer needed
            ctx.close();
        } catch (NamingException e) {
            e.printStackTrace();
            } finally {
                // Restore
                Thread.currentThread().setContextClassLoader(prevCl);
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-01 04:04

    Update 2014: this is the code from the accepted answer, by Jonathan Spooner from 2011, slightly rewritten to have Eclipse's validators no longer create warnings (deprecation, rawtypes)

    //need to do add path to Classpath with reflection since the URLClassLoader.addURL(URL url) method is protected:
    public static void addPath(String s) throws Exception {
        File f = new File(s);
        URI u = f.toURI();
        URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        Class<URLClassLoader> urlClass = URLClassLoader.class;
        Method method = urlClass.getDeclaredMethod("addURL", new Class[]{URL.class});
        method.setAccessible(true);
        method.invoke(urlClassLoader, new Object[]{u.toURL()});
    }
    
    0 讨论(0)
  • 2020-12-01 04:23

    You can use the following method:

    URLClassLoader.addURL(URL url)
    

    But you'll need to do this with reflection since the method is protected:

    public static void addPath(String s) throws Exception {
        File f = new File(s);
        URL u = f.toURL();
        URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        Class urlClass = URLClassLoader.class;
        Method method = urlClass.getDeclaredMethod("addURL", new Class[]{URL.class});
        method.setAccessible(true);
        method.invoke(urlClassLoader, new Object[]{u});
    }
    

    See the Java Trail on Reflection. Especially the section Drawbacks of Reflection

    0 讨论(0)
提交回复
热议问题