Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[platform-ant-dev] Re: write once run jar anywhere in the world

What do you think of my run jar anywhere in the world ?
 
/*
 * runjar.java
 *
 * Created on 22 February 2003, 16:12
 */
 
package runajar;
 
/**
 *
 * @author  Zahid Rahman
   Copyright - All rights reserved
 */
 
import java.net.*;
import java.io.*;
 
/**
 * <p>Title: run a jar <u>from</u> anywhere in the world</p>
 * <p>Description: java -jar runajar.jar <url or path of the jar to run> <arguments>
 *             or: runajar <url or path of the jar to run> <arguments></p>
 * <p>Company: objectworlds</p>
 * @author zahid
 * @version 1.0
 *
 */
 
 
public class Runajar {
 
  static final int BLOCK_SIZE = 65500; // bytes
  static byte[] buf = new byte[BLOCK_SIZE];
  static final int SLEEP_UNIT = 333;   // msec
  static final String TMP_DIR = "/tmp/runjar";
 
  public static void main(String[] args) {
    try {
      if (args.length > 0) {
        String urlstring = args[0]; // jar url string
        File here = new File(".");
        File localcopy = new File(urlstring);
 
        if (!localcopy.exists()) {
          URL url = "" URL(urlstring);
          String filename = urlstring.substring(urlstring.lastIndexOf('/') + 1); // jar name
          File root = new File(here.getAbsolutePath()); // is not it something?
          while (root.getParent() != null && root.getParent() != root.getCanonicalPath()) {
            root = new File(root.getParent()); // that's the way to find the root
          }
          File tmpdir = new File(root, TMP_DIR);
          if (!tmpdir.exists()) tmpdir.mkdirs();
 
          localcopy = new File(tmpdir, filename); // local copy of the jar
          InputStream is = new BufferedInputStream(url.openStream());
          OutputStream os = new BufferedOutputStream(new FileOutputStream(localcopy));
          pipe(is, os, true);
          os.close();
          is.close();
        }
        String javaexec = System.getProperty("java.home") + File.separator +
                  "bin" + File.separator +
                  "java";
        String cmd =  javaexec + " -jar " + localcopy.getAbsolutePath();
 
        for (int i = 1; i < args.length; i++) {
          cmd += """ + args[i] + """;
        }
        Process process = Runtime.getRuntime().exec(cmd, null, here);
        int result = 0;
 
        for (boolean isRunning = true; isRunning;) {
          Thread.sleep(SLEEP_UNIT);
          try {
            result = process.exitValue();
            isRunning = false;
          } catch (IllegalThreadStateException ie) {}
 
          try {
            pipe(System.in, process.getOutputStream(), false);
            pipe(process.getErrorStream(), System.err, false);
            pipe(process.getInputStream(), System.out, false);
          } catch(Exception e) {}
        }
        System.exit(result);
      }
    } catch (Exception e) {
      System.err.println(e);
    }
  }
 
  static void pipe(InputStream in, OutputStream out, boolean isBlocking) throws IOException {
    int nread;
    int navailable;
    int total = 0;
    synchronized (in) {
      while((navailable = isBlocking ? Integer.MAX_VALUE : in.available()) > 0 &&
            (nread = in.read(buf, 0, Math.min(buf.length, navailable))) >= 0) {
        out.write(buf, 0, nread);
        total += nread;
      }
    }
    out.flush();
  }
}
running instructions
 
Regards,
Zahid Rahman
 

Back to the top