Invoke a binary inside of .jar

I’m working on a Java GUI for an OCaml executable. I need to execute a binary that resides in a .jar. It turns out that binaries cannot be executed while in the .jar. The binaries have to be copied from the .jar and placed on the host machine. I chose to place the binaries in a temporary file. Then the .jar can use system commands to interact with binaries it needs to execute.

The following thread led me in this direction. Thank you, stackoverflow.com!

http://stackoverflow.com/questions/4764347/extract-and-load-dll-from-jar

Here is some example code to copy a file from your .jar to the host machine.

   

try {
    // Get a handle (as a stream) on the binary you want to move from the .jar to a folder on the system
    InputStream in = Toolkit.getDefaultToolkit().getClass().getResourceAsStream("/path/to/binary/in/jar");

    // Get a handle on where you want the binary to be saved.
    File fileOut = new File("/path/you/want/to/place/your/lib/binaryname");

    // make sure the path to the file exists
    fileOut.mkdirs();

    // Create an output stream to put data into.
    OutputStream out = new FileOutputStream(fileOut);

    // Copy the bytes from our input stream to our output stream.
    byte[] buf = new byte[1024];

    int len;

    while((len = in.read(buf)) > 0) {

        out.write(buf, 0, len);

    }

    in.close();
    out.close();

} catch (Exception e) {
    //handle
}

After a successful copy you can then use the Runtime to execute your command.

  

try {
    String command = "path/to/binary -args";

    Process p = Runtime.getRuntime().exec(command);
    BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
    BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

    String s = null;

    while ((s = stdInput.readLine()) != null) {
        System.out.println(s);

    }

    // read any errors from the attempted command
    System.out.println("Here is the standard error of the command (if any):n");

    while ((s = stdError.readLine()) != null) {
        System.err.println(s);
    }

}

catch(Exception e){
    //handle
}

Leave a Reply