2011-01-11 6 views
3

У меня есть программа, которая должна иметь возможность динамически загружать JAR во время выполнения. Оглядываясь по сторонам, я использую URLClassLoader, но я не уверен, как заставить его работать. JAR «openup.jar» находится в том же каталоге, что и программа.Динамически загружать JAR с помощью URLClassLoader?

Идеально Я хотел был бы иметь возможность загрузить этот JAR без указания каждого отдельного класса внутри него.

+3

возможно дубликат [Как я должен загрузить Баночки динамически во время выполнения] (http://stackoverflow.com/questions/60764/how-should-i-load-jars-dynamic-at-runtime) – dogbane

+0

Что именно вы подразумеваете под «загрузкой этого JAR без необходимости знать, что внутри него»? Что именно вы хотите загрузить из него? –

+0

Зачем вам загружать банку, не зная, что внутри? Вы хотите обрабатывать его как zip-файл или вы заинтересованы в загрузке классов Java? – pgras

ответ

1

Что я с успехом использовал:

@SuppressWarnings("unchecked") 
public void addURL(URL u) throws IOException { 
    URLClassLoader sysLoader = (URLClassLoader) ThisClass.class.getClassLoader(); 
    URL urls[] = sysLoader.getURLs(); 
    for (int i = 0; i < urls.length; i++) { 
     if (urls[i].toString().equalsIgnoreCase(u.toString())) { 
      return; 
     } 
    } 
    Class sysclass = URLClassLoader.class; 
    try { 
     Method method = sysclass.getDeclaredMethod("addURL", parameters); 
     method.setAccessible(true); 
     method.invoke(sysLoader, new Object[] { u }); 
    } catch (Throwable t) { 
     throw new IOException("Error, could not add URL to system classloader"); 
    } 
} 

Почти идентичный раствор действительно представлен в How should I load Jars dynamically at runtime?

+0

Это выглядит как страшная идея, поскольку она делает много предположений, которые никоим образом не гарантируются: 1.) что загрузчик классов thisClass' является 'URLClassLoader'; 2.), что класс 'URLClassLoader' имеет метод' addURL' (который делает то, что вы хотите) и 3.), что вы можете вызывать 'setAccessible()' (т. Е. Никакой менеджер безопасности не работает и запрещает это). –

+1

Да, это правда, но это хорошо работает в моем случае. У вас есть более чистое решение? – morja

+0

Спасибо Morja, я * думаю *, если я правильно понимаю код, это может сделать то, что я сделал, но если нет, тогда это был еще ответ, так что спасибо. – Myn

Смежные вопросы