Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从另一个jar文件调用类?_Java_Classloader - Fatal编程技术网

Java 如何从另一个jar文件调用类?

Java 如何从另一个jar文件调用类?,java,classloader,Java,Classloader,我目前正试图加载一个类或通过使用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$AppClassLo

我目前正试图加载一个类或通过使用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)`
程序还会找到jar,上面写着foundmyclass,我还将主类初始化为它找到的类。问题是,它根本找不到类,即使它是在技术上找到并设置的

我已经用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;
    }
}
`
`private static JarFile JarFile;
@抑制警告(“未使用”)
公共静态void main(字符串[]args)引发IOException
{
/**jar文件的输入*/
jarFile=newjarfile(“MyJarFile.jar”);
枚举e=jarFile.entries();
URL[]URL={newURL(“jar:file:“+”MyJarFile.jar“+”!/”)};
URLClassLoader cl=URLClassLoader.newInstance(URL);
类mainClass=null;
而(e.hasMoreElements())
{
JarEntry je=e.nextElement();
if(je.isDirectory()| |!je.getName().endsWith(“.class”)){
继续;
}
字符串className=je.getName().substring(0,je.getName().length()-6);
className=className.replace(“/”,“.”);
尝试
{
c类=cl.loadClass(类名);
if(className.equals(“MyClass”))
{
mainClass=c;
System.out.println(“找到MyClass”);
尝试
{
/**我用来调用主类的方法*/
Class cls=Class.forName(className);
Method=cls.getMethod(“main”,字符串[].class);
字符串[]参数=新字符串[]{};
调用(null,(Object)参数);
jarFile.close();
}
捕获(例外情况除外)
{
例如printStackTrace();
}
}
System.out.println(“加载:+className”);
}
捕获(例外情况除外)
{
例如printStackTrace();
}
}
如果(mainClass==null)
{
返回;
}
}
`

我基本上希望程序在jar内部运行main方法并启动它。

我真的不知道为什么您要尝试使用
class.forName
加载类,而您已经使用
classloader.loadClass
从正确的类加载器加载了它

拆线

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

我真的不知道为什么要尝试使用
class.forName
加载类,而您已经使用
classloader.loadClass
从正确的类加载器加载了它

拆线

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

我通过使用Class cls=mainClass来修复它;这对mel来说是可行的,谢谢你。当然,你把
c
的值分配给了
mainClass
上面几行(
mainClass=c;
),这样也行。我通过这样做,成功地解决了这个问题,Class cls=mainClass;这对mel来说是可行的,谢谢你。当然,你把
c
的值分配给了
mainClass
上面几行(
mainClass=c;
),这样也行。