使用反射作为hadoop jar运行的程序抛出java.lang.noclassdeffounderror

cld4siwp  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(412)

我有一个基础和子类。要求使用反射调用子类的方法。下面是两个程序。
基本.java

  1. import java.io.File;
  2. import java.net.URL;
  3. import java.net.URLClassLoader;
  4. public class base {
  5. public static void main(String[] args) {
  6. URLClassLoader loader = null;
  7. Class<?> cls;
  8. try {
  9. File file = new File("sub.jar" );
  10. URL[] urls = { file.toURI().toURL() };
  11. loader = new URLClassLoader(urls);
  12. cls = loader.loadClass("sub");
  13. base obj = (base) cls.newInstance();
  14. obj.print();
  15. }
  16. catch(Exception e) {
  17. System.out.println("Exception occured:" + e);
  18. e.printStackTrace();
  19. }
  20. }
  21. public void print() {
  22. System.out.println("In Base class");
  23. }
  24. }

子.java

  1. public class sub extends base {
  2. public void print() {
  3. System.out.println("In subclass");
  4. }
  5. }

将两者编译到jar中。

  1. javac base.java;
  2. jar cvf base.jar base.class
  3. javac sub.java;
  4. jar cvf sub.jar sub.class

如果我将base.jar作为“java-cp”调用,它就可以正常工作

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

但是如果我用hadoopjar命令调用它

  1. hadoop jar base.jar base
  2. Exception in thread "main" java.lang.NoClassDefFoundError: base
  3. at java.lang.ClassLoader.defineClass1(Native Method)
  4. at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
  5. at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
  6. at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
  7. at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
  8. at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
  9. at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
  10. at java.security.AccessController.doPrivileged(Native Method)
  11. at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
  12. at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  13. at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  14. at base.main(base.java:15)
  15. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  16. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  17. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  18. at java.lang.reflect.Method.invoke(Method.java:498)
  19. at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
  20. at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
  21. Caused by: java.lang.ClassNotFoundException: base
  22. at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
  23. at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  24. at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

非常感谢您的帮助。

xlpyo6sf

xlpyo6sf1#

我相信你的问题是在第15行,你试图案件作为你的基类装载机。我相信编译器不知道如何处理这个问题。另外,我不知道为什么要用hadoop运行这个程序,因为它没有任何hadoop实现或类

bkkx9g8r

bkkx9g8r2#

通过将base.jar放在hadoop类路径中解决了这个问题。运行“hadoop classpath”命令,列出所有类路径目录。将jar放在其中一个目录中。

相关问题