ClassNotFoundException при попытке загрузить класс из файла JAR во время выполнения в Java - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь динамически выполнить функцию из класса в файле jar.У меня есть местоположение файла jar, имя класса и функции в нем в виде строк.

Я посмотрел на эти вопросы, но ни один из ответов не сработал для меня:

Как динамически загружать JAR во время выполнения?

ClassNotFoundException при попытке загрузить класс из внешнего JAR во время выполнения

Как загрузитьфайл jar во время выполнения

динамически загружать jar

динамически загружать jar во время выполнения?

Вот чтоУ меня так далеко: В основной программе:

    public class Main
    {

        public static void main(String[] args)
        {
            File file = new File("E:\\DeSKtop\\hw.jar");   
            String lcStr = "Main1";   
            URL jarfile;
            try {
                jarfile = new URL("jar", "","file:" + file.getAbsolutePath()+"!/");
                URLClassLoader cl = URLClassLoader.newInstance(new URL[] {jarfile });   
                Class loadedClass = cl.loadClass(lcStr);
                Method method = loadedClass.getDeclaredMethod("returnHW");
                Object instance = loadedClass.newInstance();
                Object result = method.invoke(instance);
                //System.out.println(method.invoke());
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }    
            //System.out.println(loadLibrary(myJar));
            catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

В файл JAR я пытаюсь загрузить:

public class Main1 {
    public static void main(String[] args)
    {

    }
    public static String returnHW()
    {
        System.out.println("HlloWOrld");;
        return "Hello Wrld!";
    }

}

Когда я пытаюсь запустить основную программу, яполучите это:

java.lang.ClassNotFoundException: Main1
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.net.FactoryURLClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at Main.main(Main.java:22)

Можете ли вы сказать мне, что я делаю неправильно?Заранее спасибо.

1 Ответ

0 голосов
/ 14 октября 2018

решение состоит в том, что вы должны указывать также и пакеты.

Если вы обновите свою переменную lcStr, в которой вы храните имя класса, для включения пакета, она должна работать.

Пример:

        String lcStr = "com.company.Main1";
...