Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Pluggable приложение. Не могу загрузить класс.


Автор: panukov 23.6.2010, 10:59
Делаю на основе http://voituk.kiev.ua/2008/01/14/java-plugins/

Написан интерфейс, простой, для понимания процесса:

Код

public interface Plugin_Interface{
    public void invoke();
}


Далее два класса-плагина

Код

public class Plugin implements Plugin_Interface{
    public void invoke() {
        System.out.println("I'm plugin A");
    }
}



и

Код

public class Plugin implements Plugin_Interface{
    public void invoke() {
        System.out.println("I'm plugin B");
    }
}



Далее пытаюсь загрузить оба плагина:
Код

import java.io.*;
import java.net.*;

public class Loader{
    public static void main(String argv[]){
        File pluginDir = new File("plugins");
        File[] jars = pluginDir.listFiles(
            new FileFilter() {
                public boolean accept(File file) {
                    return file.isFile() && file.getName().endsWith(".jar");
                }
            }
        );
        System.out.println(jars.length);

        Class[] pluginClasses = new Class[jars.length];

        for (int i = 0; i < jars.length; i++) {
            try {
                URL jarURL = jars[i].toURI().toURL();
                URLClassLoader classLoader = new URLClassLoader(new URL[]{jarURL});
                pluginClasses[i] = classLoader.loadClass("com.plugins.PluginA");

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}


Сборка интерфейса, плагинов, класса Loader происходит без ошибок. Когда начинаю выполнять Loader, вылетает ошибка:
Код

C:\Projects\pluggable>java Loader
2
java.lang.ClassNotFoundException: com.plugins.PluginA
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at Loader.main(Loader.java:22)
java.lang.ClassNotFoundException: com.plugins.PluginA
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at Loader.main(Loader.java:22)


или так:
Код

C:\Projects\pluggable>java -cp ..\Plugin_interface Loader
Exception in thread "main" java.lang.NoClassDefFoundError: Loader



структура каталогов:
Код

Progects->pluggable ->Loader.java
Progects->pluggable ->Loader.class
Progects->pluggable ->plugins->PluginA.jar
Progects->pluggable ->plugins->PluginB.jar
Progects->Plugin_interface->Plugin_Interface.java
Progects->Plugin_interface->Plugin_Interface.class


Автор: Kircul 23.6.2010, 12:16
Гугл все еще неплохо работает. http://java.sun.com/docs/books/tutorial/deployment/jar/jarclassloader.html.

Автор: COVD 23.6.2010, 16:42
http://www.osgi.org/Main/HomePage

Автор: panukov 23.6.2010, 19:10
Всем спасибо. Разобрался. Неверно был указан classname.
Насчет OSGi - отдельное спасибо. Буду изучать.
Если кто будет искать - вот рабочий код:

Код

import java.io.*;
import java.net.*;
import java.lang.ClassLoader; 
import java.lang.reflect.Method;

public class Loader{
    public static void main(String argv[]){
        File pluginDir = new File("plugins");
        File[] jars = pluginDir.listFiles(
            new FileFilter() {
                public boolean accept(File file) {
                    return file.isFile() && file.getName().endsWith(".jar");
                }
            }
        ); //Получили список jar - плагинов

        for (int i = 0; i < jars.length; i++) {
            try {
                URL jarURL = jars[i].toURI().toURL();
                //для каждого плагина создаем свой загрузчик
                URLClassLoader classLoader = new URLClassLoader(new URL[]{jarURL});
                //загружаем класс
                Class c = classLoader.loadClass("Plugin");
                //у метода класса нет аргументов, след-о, types и margs - пустые
                Class[] types = {};
                //получаем метод public void invoke()
                Method useValue = c.getDeclaredMethod("invoke", types);
                Object[] margs = {};
                //создаем экземпляр класса
                Object ctx0 = c.newInstance();
                //выполняем метод
                useValue.invoke(ctx0, margs);
            } catch (MalformedURLException e) {

                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)