2016-02-22 4 views
1

Мне нужно загрузить файл jar во время выполнения на Java, и у меня есть этот код, но он не загружает jar, и я не знаю, как, кто-нибудь может сказать мне, почему? У меня есть JVM 8 и NetBeans 8, цель - создать программу, которая может загружать файлы jar в виде плагинов для Windows.Java classpath и classloading

package prueba.de.classpath; 
import java.io.File; 
import java.lang.reflect.Method; 
import java.net.URL; 
import java.net.URLClassLoader; 

public class PruebaDeClasspath { 

    public static void main(String[] args) { 
     try { 
      Class.forName("PluginNumeroUno"); 
     } catch (ClassNotFoundException e) { 
      System.out.println("Not Found"); 
     } 

     try { 
      URLClassLoader classLoader = ((URLClassLoader) ClassLoader 
        .getSystemClassLoader()); 
      Method metodoAdd = URLClassLoader.class.getDeclaredMethod("addURL", 
        new Class[]{URL.class}); 
      metodoAdd.setAccessible(true); 


      File file = new File("plugins/PrimerPlugins.jar"); 

      URL url = file.toURI().toURL(); 
      System.out.println(url.toURI().toURL()); 

      metodoAdd.invoke(classLoader, new Object[]{url}); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     try { 
      Class.forName("PluginNumeroUno"); 
      System.out.println("ok"); 
     } catch (ClassNotFoundException e) { 
      System.out.println("Not Found"); 
     } 

    } 

} 
+1

Предоставьте свой текущий выход System.out консоли в вопрос – flakes

+1

У меня возникает ощущение, что вы изобретаете колесо здесь. Именно поэтому вам нужно вручную загрузить jar-файл? 'java --classpath' не делает трюк? – Tobb

ответ

1

Попробуйте создать новый загрузчик классов вместо того, чтобы бросать системный загрузчик классов.

Удалить эту строку:

URLClassLoader classLoader = ((URLClassLoader) ClassLoader.getSystemClassLoader()); 

и создать новый загрузчик и использовать его, как показано ниже:

File file = new File("plugins/PrimerPlugins.jar"); 
URLClassLoader classLoader = new URLClassLoader(new URL[]{file.toURI().toURL()},  
    PruebaDeClasspath.class.getClassLoader()); 
Class.forName("prueba.de.classpath.PluginNumeroUno", true, classLoader); //fully qualified! 

Пожалуйста, обратите внимание, что имя класса для загрузки должен быть полным.

Вам также не нужно динамически заставлять addURL() быть общедоступным.