如何从另一个JAR文件调用类



我当前正在尝试加载类或通过使用Java的反射来调用JAR文件的主类。

每当我尝试运行它时,我都会收到以下错误:

`java.lang.ClassNotFoundException: MyClass
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.test.Test.main(Test.java:43)`

该程序还会发现罐子说MyClass A,我还将主要类是其发现的类。问题是,即使在技术上找到并设置了该类。

我已经尝试了使用Invoke的方法来加载项目内部的主类。

`private static JarFile jarFile;
@SuppressWarnings("unused")
public static void main(String[] args) throws IOException
{
    /** Input of jar file */
    jarFile = new JarFile("MyJarFile.jar");
    Enumeration<JarEntry> e = jarFile.entries();
    URL[] urls = { new URL("jar:file:" + "MyJarFile.jar" +"!/") };
    URLClassLoader cl = URLClassLoader.newInstance(urls);
    Class<?> mainClass = null;
    while (e.hasMoreElements()) 
    {
        JarEntry je = e.nextElement();
        if(je.isDirectory() || !je.getName().endsWith(".class")){
            continue;
        }
        String className = je.getName().substring(0, je.getName().length()-6);
        className = className.replace('/', '.');
        try
        {
            Class<?> c = cl.loadClass(className);
            if (className.equals("MyClass"))
            {
                mainClass = c;
                System.out.println("Found MyClass");
                try
                {
                    /** The method I use to invoke the main class */
                    Class<?> cls = Class.forName(className);
                    Method method = cls.getMethod("main", String[].class);
                    String[] params = new String[]{};
                    method .invoke(null, (Object) params);
                    jarFile.close();
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
            System.out.println("Loaded: " + className);
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
    if (mainClass == null)
    {
        return;
    }
}
`

我基本上希望该程序在罐子内部运行主要方法并启动它。

我真的不确定当您已经从 recript classloader加载 ClassLoader.loadClass时,为什么要使用 Class.forName加载类。<<

删除线

Class<?> cls = Class.forName(className);

(它试图从行本身运行的classloader加载类,这不是classloader,而不是加载 MyClass(

并将线路更改为:

Method method = c.getMethod("main", String[].class);

最新更新