【发布时间】:2014-11-16 06:20:28
【问题描述】:
该应用程序是模块化插件架构。也就是说,在完成工作的同时动态加载类。为此,自定义类加载器扩展了 ClassLoader。
问题的本质是在Eclipse应用程序运行,而在终端(ubuntu)使用以下代码行(其中目录“m /”表示模块的位置* .class):
java -jar ModularApp.jar m/
我收到以下消息:
10:07:24,085 DEBUG main CModuleLoader:findClass:39 - 系统类加载器的运行。 线程“主”java.lang.reflect.InvocationTargetException 中的异常 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 引起:java.lang.NoClassDefFoundError: ru/intetech/module/CModule 在 java.lang.ClassLoader.defineClass1(Native Method) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:800) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:643) 在 ru.intetech.moduleloader.CModuleLoader.findClass(CModuleLoader.java:35) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:425) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:358) 在 ru.intetech.modularApp.Main.main(Main.java:42) ... 5 更多原因: java.lang.ClassNotFoundException:ru.intetech.module.CModule 在 java.lang.ClassLoader.findClass(ClassLoader.java:531) 在 ru.intetech.moduleloader.CModuleLoader.findClass(CModuleLoader.java:40) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:425) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 12 更多
这是一段sn-p的代码,用户类加载器(扩展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));
}
}
可能是什么问题?
附:在本文的基础上实现的Loader: http://sysmagazine.com/posts/104229/
【问题讨论】:
标签: java eclipse terminal classloader