该应用程序是模块化插件架构。也就是说,虽然工作是动态加载类。为此,自定义类加载器扩展了ClassLoader。
问题的实质是在Eclipse应用程序运行时,在终端(ubuntu)中使用以下代码行(其中目录“m /”表示模块的位置* .class):
java -jar ModularApp.jar m/
我收到以下消息:
10:07:24,085 DEBUG main CModuleLoader:findClass:39 - 运行System Classloader。 线程“main”中的异常java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:606)at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 引起:java.lang.NoClassDefFoundError:ru / intetech / module / CModule at java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:800)at java.lang.ClassLoader.defineClass(ClassLoader.java:643)at ru.intetech.moduleloader.CModuleLoader.findClass(CModuleLoader.java:35) 在java.lang.ClassLoader.loadClass(ClassLoader.java:425)at java.lang.ClassLoader.loadClass(ClassLoader.java:358)at ru.intetech.modularApp.Main.main(Main.java:42)... 5更多引起的: java.lang.ClassNotFoundException:ru.intetech.module.CModule at java.lang.ClassLoader.findClass(ClassLoader.java:531)at ru.intetech.moduleloader.CModuleLoader.findClass(CModuleLoader.java:40) 在java.lang.ClassLoader.loadClass(ClassLoader.java:425)at java.lang.ClassLoader.loadClass(ClassLoader.java:358)... 12更多
这是一段代码,用户类加载器(扩展ClassLoader),出现错误:
protected Class<?> findClass(String className) throws ClassNotFoundException
{
try
{
byte b[]=getClassAsBytes(m_pathToBin+className+".class");
return (defineClass(className, b, 0, b.length));
}
catch(FileNotFoundException ex)
{
m_log.debug("Run of the System Classloader.");
return (super.findClass(className));
}
catch(IOException ex)
{
m_log.debug("Run of the Bootstrap.");
return (super.findClass(className));
}
}
可能是什么问题?
P.S。在本文的基础上实现的Loader: http://sysmagazine.com/posts/104229/
答案 0 :(得分:0)
查看:堆栈跟踪显示消息“系统类加载器的运行”,这证明第一个捕获已执行。这是由FileNotFoundException引起的,它明显出现在getClassAsBytes方法中:这是您必须调查的内容:找出您要读取的文件(显示绝对路径的跟踪),以及为什么该文件不存在。
(最后,该catch块尝试通过系统类加载器加载所需的类,该类加载器无法访问该类,因此,它会抛出ClassNotFoundException。)