2017-04-19 68 views
0

我有一個基類和子類。要求是使用反射調用子類的方法。這兩個程序都在下面。使用反射程序運行hadoop jar拋出java.lang.NoClassDefFoundError

base.java

import java.io.File; 
import java.net.URL; 
import java.net.URLClassLoader; 
public class base { 
    public static void main(String[] args) { 
     URLClassLoader loader = null; 
     Class<?> cls; 

     try { 
      File file = new File("sub.jar"); 
      URL[] urls = { file.toURI().toURL() }; 
      loader = new URLClassLoader(urls); 

      cls = loader.loadClass("sub"); 
      base obj = (base) cls.newInstance(); 

      obj.print(); 

     } 
     catch(Exception e) { 
      System.out.println("Exception occured:" + e); 
      e.printStackTrace(); 
     } 
    } 

    public void print() { 
     System.out.println("In Base class"); 
    } 
} 

sub.java

public class sub extends base { 

    public void print() { 
     System.out.println("In subclass"); 
    } 
} 

都到罐子編譯。

javac base.java; 
jar cvf base.jar base.class 

javac sub.java; 
jar cvf sub.jar sub.class 

如果我調用base.jar爲 「java命令」,它工作正常

java -cp base.jar base 
output: "In subclass" 

但是,如果我有 「的Hadoop罐子」 命令調用它,我得到

hadoop jar base.jar base 

Exception in thread "main" java.lang.NoClassDefFoundError: base 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:763) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 
     at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:368) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:362) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:361) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     at base.main(base.java:15) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at org.apache.hadoop.util.RunJar.run(RunJar.java:221) 
     at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 
Caused by: java.lang.ClassNotFoundException: base 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 

任何幫助,非常感謝。

回答

0

我相信你的問題是在第15行,你試圖將加載器作爲你的基類。我相信編譯器不知道如何處理它。另外,我不確定你爲什麼試圖用Hadoop來運行這個程序,因爲它沒有任何hadoop實現或類。

+0

Marty,我把我的程序剝離成了沒有hadoop類的簡單代碼,只是爲了演示 –

0

這個問題可以通過在hadoop classpath中放置base.jar來解決。運行「hadoop classpath」命令,其中列出所有classpath目錄。將jar放在這些目錄之一中。

相關問題