RunJar.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:5k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.util;
  19. import java.util.jar.*;
  20. import java.lang.reflect.*;
  21. import java.net.URL;
  22. import java.net.URLClassLoader;
  23. import java.io.*;
  24. import java.util.*;
  25. import org.apache.hadoop.conf.Configuration;
  26. import org.apache.hadoop.fs.FileUtil;
  27. /** Run a Hadoop job jar. */
  28. public class RunJar {
  29.   /** Unpack a jar file into a directory. */
  30.   public static void unJar(File jarFile, File toDir) throws IOException {
  31.     JarFile jar = new JarFile(jarFile);
  32.     try {
  33.       Enumeration entries = jar.entries();
  34.       while (entries.hasMoreElements()) {
  35.         JarEntry entry = (JarEntry)entries.nextElement();
  36.         if (!entry.isDirectory()) {
  37.           InputStream in = jar.getInputStream(entry);
  38.           try {
  39.             File file = new File(toDir, entry.getName());
  40.             if (!file.getParentFile().mkdirs()) {
  41.               if (!file.getParentFile().isDirectory()) {
  42.                 throw new IOException("Mkdirs failed to create " + 
  43.                                       file.getParentFile().toString());
  44.               }
  45.             }
  46.             OutputStream out = new FileOutputStream(file);
  47.             try {
  48.               byte[] buffer = new byte[8192];
  49.               int i;
  50.               while ((i = in.read(buffer)) != -1) {
  51.                 out.write(buffer, 0, i);
  52.               }
  53.             } finally {
  54.               out.close();
  55.             }
  56.           } finally {
  57.             in.close();
  58.           }
  59.         }
  60.       }
  61.     } finally {
  62.       jar.close();
  63.     }
  64.   }
  65.   /** Run a Hadoop job jar.  If the main class is not in the jar's manifest,
  66.    * then it must be provided on the command line. */
  67.   public static void main(String[] args) throws Throwable {
  68.     String usage = "RunJar jarFile [mainClass] args...";
  69.     if (args.length < 1) {
  70.       System.err.println(usage);
  71.       System.exit(-1);
  72.     }
  73.     int firstArg = 0;
  74.     String fileName = args[firstArg++];
  75.     File file = new File(fileName);
  76.     String mainClassName = null;
  77.     JarFile jarFile;
  78.     try {
  79.       jarFile = new JarFile(fileName);
  80.     } catch(IOException io) {
  81.       throw new IOException("Error opening job jar: " + fileName)
  82.         .initCause(io);
  83.     }
  84.     Manifest manifest = jarFile.getManifest();
  85.     if (manifest != null) {
  86.       mainClassName = manifest.getMainAttributes().getValue("Main-Class");
  87.     }
  88.     jarFile.close();
  89.     if (mainClassName == null) {
  90.       if (args.length < 2) {
  91.         System.err.println(usage);
  92.         System.exit(-1);
  93.       }
  94.       mainClassName = args[firstArg++];
  95.     }
  96.     mainClassName = mainClassName.replaceAll("/", ".");
  97.     File tmpDir = new File(new Configuration().get("hadoop.tmp.dir"));
  98.     tmpDir.mkdirs();
  99.     if (!tmpDir.isDirectory()) { 
  100.       System.err.println("Mkdirs failed to create " + tmpDir);
  101.       System.exit(-1);
  102.     }
  103.     final File workDir = File.createTempFile("hadoop-unjar", "", tmpDir);
  104.     workDir.delete();
  105.     workDir.mkdirs();
  106.     if (!workDir.isDirectory()) {
  107.       System.err.println("Mkdirs failed to create " + workDir);
  108.       System.exit(-1);
  109.     }
  110.     Runtime.getRuntime().addShutdownHook(new Thread() {
  111.         public void run() {
  112.           try {
  113.             FileUtil.fullyDelete(workDir);
  114.           } catch (IOException e) {
  115.           }
  116.         }
  117.       });
  118.     unJar(file, workDir);
  119.     
  120.     ArrayList<URL> classPath = new ArrayList<URL>();
  121.     classPath.add(new File(workDir+"/").toURL());
  122.     classPath.add(file.toURL());
  123.     classPath.add(new File(workDir, "classes/").toURL());
  124.     File[] libs = new File(workDir, "lib").listFiles();
  125.     if (libs != null) {
  126.       for (int i = 0; i < libs.length; i++) {
  127.         classPath.add(libs[i].toURL());
  128.       }
  129.     }
  130.     
  131.     ClassLoader loader =
  132.       new URLClassLoader(classPath.toArray(new URL[0]));
  133.     Thread.currentThread().setContextClassLoader(loader);
  134.     Class<?> mainClass = Class.forName(mainClassName, true, loader);
  135.     Method main = mainClass.getMethod("main", new Class[] {
  136.       Array.newInstance(String.class, 0).getClass()
  137.     });
  138.     String[] newArgs = Arrays.asList(args)
  139.       .subList(firstArg, args.length).toArray(new String[0]);
  140.     try {
  141.       main.invoke(null, new Object[] { newArgs });
  142.     } catch (InvocationTargetException e) {
  143.       throw e.getTargetException();
  144.     }
  145.   }
  146.   
  147. }