解决Eclipse中运行WordCount出现 java.lang.ClassNotFoundException: org.apache.hadoop.examples.WordCount$TokenizerMapper问题【转】

View Code
 1 package org.apache.hadoop.examples;
 2  
 3  import java.io.File;
 4  import java.io.FileInputStream;
 5  import java.io.FileOutputStream;
 6  import java.io.IOException;
 7  import java.net.URL;
 8  import java.net.URLClassLoader;
 9  import java.util.ArrayList;
10  import java.util.List;
11  import java.util.jar.JarEntry;
12  import java.util.jar.JarOutputStream;
13  import java.util.jar.Manifest;
14  
15  public class EJob {
16  
17      // To declare global field
18      private static List<URL> classPath = new ArrayList<URL>();
19  
20      // To declare method
21      public static File createTempJar(String root) throws IOException {
22          if (!new File(root).exists()) {
23              return null;
24          }
25          Manifest manifest = new Manifest();
26          manifest.getMainAttributes().putValue("Manifest-Version", "1.0");
27          final File jarFile = File.createTempFile("EJob-", ".jar", new File(
28                  System.getProperty("java.io.tmpdir")));
29  
30          Runtime.getRuntime().addShutdownHook(new Thread() {
31              public void run() {
32                  jarFile.delete();
33              }
34          });
35  
36          JarOutputStream out = new JarOutputStream(
37                  new FileOutputStream(jarFile), manifest);
38          createTempJarInner(out, new File(root), "");
39          out.flush();
40          out.close();
41          return jarFile;
42      }
43  
44      private static void createTempJarInner(JarOutputStream out, File f,
45              String base) throws IOException {
46          if (f.isDirectory()) {
47              File[] fl = f.listFiles();
48              if (base.length() > 0) {
49                  base = base + "/";
50              }
51              for (int i = 0; i < fl.length; i++) {
52                  createTempJarInner(out, fl[i], base + fl[i].getName());
53              }
54          } else {
55              out.putNextEntry(new JarEntry(base));
56              FileInputStream in = new FileInputStream(f);
57              byte[] buffer = new byte[1024];
58              int n = in.read(buffer);
59              while (n != -1) {
60                  out.write(buffer, 0, n);
61                  n = in.read(buffer);
62              }
63              in.close();
64          }
65      }
66  
67      public static ClassLoader getClassLoader() {
68          ClassLoader parent = Thread.currentThread().getContextClassLoader();
69          if (parent == null) {
70              parent = EJob.class.getClassLoader();
71          }
72          if (parent == null) {
73              parent = ClassLoader.getSystemClassLoader();
74          }
75          return new URLClassLoader(classPath.toArray(new URL[0]), parent);
76      }
77  
78      public static void addClasspath(String component) {
79  
80          if ((component != null) && (component.length() > 0)) {
81              try {
82                  File f = new File(component);
83  
84                  if (f.exists()) {
85                      URL key = f.getCanonicalFile().toURL();
86                      if (!classPath.contains(key)) {
87                          classPath.add(key);
88                      }
89                  }
90              } catch (IOException e) {
91              }
92          }
93      }
94  
95  }

mian方法中添加:

File jarFile = EJob.createTempJar("bin");

EJob.addClasspath("/usr/hadoop/conf");

ClassLoader classLoader = EJob.getClassLoader();

Thread.currentThread().setContextClassLoader(classLoader);

。。。

((JobConf) job.getConfiguration()).setJar(jarFile.toString()); 

原文地址:https://www.cnblogs.com/94julia/p/2966705.html