我当前正在尝试加载类或通过使用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);