【问题标题】:ClassNotFoundException when trying to load a class from a jar file at runtime in Java尝试在 Java 运行时从 jar 文件加载类时出现 ClassNotFoundException
【发布时间】:2019-03-18 23:08:58
【问题描述】:

我正在尝试从 jar 文件中的类动态执行一个函数。我有 jar 文件的位置、类的名称和其中的函数作为字符串。

我查看了这些问题,但没有一个对我有用:

How should I load Jars dynamically at runtime?

ClassNotFoundException while trying to load class from external JAR at runtime

How to load a jar file at runtime

Dynamically load a jar

Load jar dynamically at runtime?

这是我目前得到的: 在主程序中:

    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)

你能告诉我我做错了什么吗?提前谢谢你。

【问题讨论】:

    标签: java class classloader urlclassloader dynamic-class-loaders


    【解决方案1】:

    解决方案是你也必须声明包。

    如果您更新存储类名的变量 lcStr 以包含包,它应该可以工作。

    例子:

            String lcStr = "com.company.Main1";
    

    【讨论】:

    • 感谢您的回答。我更新了 jar 文件中的程序,因此它不使用默认包。我尝试将lcStr 设置为"com.returnHW.Main1",然后设置为"com.Main1""returnHW.Main1",但不幸的是,它在任何这些情况下都不起作用 - 它仍然给出相同的错误。
    • 我修复了它...我什至不知道如何,但仅使用“returnHW.Main1”时它可以工作
    猜你喜欢
    • 2017-07-08
    • 1970-01-01
    • 2019-09-08
    • 2017-05-24
    • 2017-02-15
    • 2014-07-21
    • 2011-11-14
    • 1970-01-01
    • 2013-04-15
    相关资源
    最近更新 更多