Come eseguire i comandi del terminale Mac OS da Java (utilizzando Runtime?)

Ho cercato modi per eseguire programmi esterni utilizzando il runtime di Java. Questo funziona bene, ad esempio:

String[] cmd = {"mkdir", "test"}; Runtime.getRuntime().exec(cmd); 

Crea una nuova directory come ti aspetteresti. Ora, da una finestra bash in Mac posso scrivere questo:

 love testgame 

Per eseguire il motore di gioco “Amore” in una cartella denominata testgame. Ora, la ragione per cui funziona è perché ho alias “amore” per chiamare l’eseguibile dell’amore. Ho la sensazione che questo sia il motivo per cui il seguente non funziona:

 String[] cmd = {"love", "/Users/mtc06/testgame"}; Runtime.getRuntime().exec(cmd); 

E nemmeno questo (per chi si chiede):

 String[] cmd = {"/bin/bash", "love", "/Users/mtc06/testgame"}; Runtime.getRuntime().exec(cmd); 

Non c’è dubbio che questa sia una qualche idiozia di Java da parte mia, o un po ‘di contrasto con il modo in cui funziona l’aliasing. Lo consegno ai tuoi venerabili intelletti, COSÌ!

AGGIORNAMENTO: questo non funziona neanche:

 String[] cmd = {"/bin/sh", "/Applications/love", "/Users/michaelcook/Desktop/Playout"}; Runtime.getRuntime().exec(cmd); 

L’errore che sto ricevendo è 127 dal processo generato da Runtime. Lo trovo come “comando non trovato” ovunque lo cerco.

Sospetto che il problema che hai è il percorso utilizzato per trovare i tuoi eseguibili. Dipende anche se usi un’app OSX o un cmd di unix

Se un unix cmd (o usa la parte Unix di un’app OSX ad es. /Applications/AppName.app/Contents/MacOS/AppName) allora ci sono due modi per risolvere questo problema

  1. Ad esempio, inserisci il percorso completo dell’eseguibile nel codice Java
    String[] cmd = {"/full/absolute/path/to/love", "/Users/mtc06/testgame"};

  2. Modificare il percorso per includere l’eseguibile. Questo dipende dal metodo in cui viene lanciato java.

    a) Se java viene eseguito dalla riga di comando, aggiungere la directory dell’eseguibile alla variabile d’ambiente PATH.
    b) Se il programma java viene eseguito dal Finder, il percorso deve essere modificato in ~ / MacOSX / environment.plist ad esempio aggiungendo / Users / mark / bin

      PATH /Users/mark/bin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/X11R6/bin:/usr/libexec/binutils:   

Se l’app è un’app OSX, è necessario avviarla utilizzando la riga di comando aperta

 open -a love.app "/Users/mtc06/testgame" 

quindi il comando Java è (non testato)

 String[] cmd = {"/usr/bin/open", "-a" , "love.app", "/Users/mtc06/testgame"};