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());