2015-12-07 2 views
1

Я сделал проект Java, проект contais только этот класс:Java Dynammic Класс нагрузки в веб-приложение

package test.processor; 

public abstract class Processor { 

    public abstract void loadData(String objectId); 
    public abstract void processData(); 
    public abstract void saveData(String objectId); 

} 

Проект экспортируется в виде файла банку (processor.jar)

Тогда я сделал еще проект, который импортирует processor.jar и есть класс, который расширяет Процессор:

package test.process; 

import test.processor.Processor; 

public class Process extends Processor{ 

    @Override 
    public void loadData(String objectId) { 
     System.out.println("LOAD DATAAAAAAAAAAAA");  
    } 

    @Override 
    public void processData() { 
     System.out.println("PROCESS DATAAAAAAAAAAAA"); 
    } 

    @Override 
    public void saveData(String objectId) { 
     System.out.println("SAVE DATAAAAAAAAAAAA"); 
    } 

} 

Этот проект также экспортируется в баночке (plugin.jar).

Наконец, я закодирован что-то, чтобы загрузить плагин динамически:

import test.processor.Processor; 

public class Test { 

    public void testPlugins(){ 

     Processor plugin = (Processor) loadJar(
       "C:\\Users\\...\\Desktop\\plugin.jar", 
       "test.process.Process"); 
     processor.loadData("dada"); 

    } 

    private Object loadJar(String jar, String className){ 

     File jarFile = new File(jar); 
     Object instance = null; 
     try { 
      URL jarpath = jarFile.toURI().toURL(); 
      String jarUrl = "jar:" + jarpath + "!/"; 
      URL urls[] = { new URL(jarUrl) }; 
      URLClassLoader child = new URLClassLoader(urls); 
      Class classToLoad = Class.forName(nomeClasse, true, child); 
      instance = classToLoad.newInstance(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return instance; 

    } 


} 

Если я запускаю этот код внутри основного метода он работает правильно, когда я пытаюсь запустить его на сервере возникает проблема при загрузке класс, я получаю ClassNotFoundException (Процессор). Я попытался положить банку в tomcat/lib, project/WEB-INF/lib и ничего не изменилось.

Любая идея о том, что я делаю неправильно?

ответ

0

я не решить ее так, как я хотел, но я ее решил:

Сначала я попытался загрузки process.jar вручную:

private Object loadJars(String processJar, String pluginJar, String className){ 

    File processJarFile = new File(processJar); 
    File pluginJarFile = new File(pluginJar); 


    Object instance = null; 
    try { 

     URL processJarPath = processJarFile.toURI().toURL(); 
     String processJarUrl = "jar:" + processJarPath + "!/"; 

     URL pluginJarPath = pluginJarFile.toURI().toURL(); 
     String pluginJarUrl = "jar:" + pluginJarPath + "!/"; 


     URL urls[] = { new URL(processJarUrl), new URL(pluginJarUrl) }; 
     URLClassLoader child = new URLClassLoader(urls); 
     Class classToLoad = Class.forName(nomeClasse, true, child); 
     instance = classToLoad.newInstance(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    return instance; 

} 

Это загружает класс Process правильно, проблема происходит в mehod testPlugins, когда он пытается бросить на процессор (ClassCastException, не может бросить процесс на процессор):

public void testPlugins(){ 

    Processor plugin = (Processor) loadJars("C:\\Users\\...\\Desktop\\processor.jar", 
      "C:\\Users\\...\\Desktop\\plugin.jar", 
      "test.process.Process"); 
    processor.loadData("dada"); 

} 

Еще нужно много читать о загрузки классов, но я гу Проблема заключается в том, что он не распознает Процессор, загруженный из C: \ Users \ ... \ Desktop \ processor.jar, как тот же, что и Процессор, загруженный из контекста webapp, или он «забывает». Процесс расширяет процессор.

Я был в спешке, так что я не имел времени для исследования, чтобы решить эту проблему, я вызвавшей методы с помощью отражения:

public void modifiedTestPlugins(){ 

    Object plugin = loadJar("C:\\Users\\...\\Desktop\\processor.jar", 
      "C:\\Users\\...\\Desktop\\plugin.jar", 
      "test.process.Process"); 

    try { 
     Method processData = findMethod(obj.getClass(), "processData"); 

     //here I invoke the processData method, it prints: PROCESS DATAAAAAAAAAAAA 
     loadData.invoke(processData, new Object[]{}); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

private static Method findMethod(Class clazz, String methodName) throws Exception { 
    Method[] methods = clazz.getMethods(); 
    for (int i = 0; i < methods.length; i++) { 
     if (methods[i].getName().equals(methodName)) 
      return methods[i]; 
    } 
    return null; 
}