2016-07-29 8 views
1

Ich rufe eine ausführbare Datei nodeJS in meiner Kommandozeilen-Java-App auf. Da sich die ausführbare Datei an einem Speicherort in der Variablen $PATH befindet, kann sie einfach als node bezeichnet werden. Allerdings muss ich dann einen Parameter (die .JS-Datei zum Ausführen) zur Verfügung stellen, die, wenn ich als relativen Pfad zu der ausführbaren Datei node bieten, NodeJS einen Fehler, dass es die JS-Datei nicht finden kann.

Also, was ich suche ist, um den absoluten Pfad der node ausführbare Datei, die ausgeführt wird, und kompilieren dann den absoluten Pfad der JS-Datei Ich muss als Parameter der node Befehl hinzufügen.

Gibt es einen Weg in Java, der plattformunabhängig ist? Ich realisiere, dass ich where node ausführen kann, bekomme die Ausgabe und gehe von dort, aber ich würde nicht OS-spezifische Befehle hardcodieren wollen.

Hier ist mein Code so weit:

CommandLine cmdLine = new CommandLine("node"); 
    cmdLine.addArgument("D:/SDKs/Appium/node_modules/appium/lib/server/main.js"); 
    cmdLine.addArgument("--address"); 
    cmdLine.addArgument("0.0.0.0"); 
    cmdLine.addArgument("--port"); 
    cmdLine.addArgument("4444"); 
    cmdLine.addArgument("--app"); 
    File app = new File("some.apk"); 
    cmdLine.addArgument(app.getAbsolutePath()); 
    cmdLine.addArgument("--app-pkg"); 
    cmdLine.addArgument("some.stuff.does.not.matter"); 
    cmdLine.addArgument("--pre-launch"); 
    cmdLine.addArgument("--automation-name"); 
    cmdLine.addArgument("Appium"); 
    System.out.println(cmdLine.toString()); 
    DefaultExecutor executor = new DefaultExecutor(); 
    ExecuteWatchdog watchdog = new ExecuteWatchdog(60000); 
    executor.setWatchdog(watchdog); 
    try { 
     int exitValue = executor.execute(cmdLine); 
    } catch (IOException e) { 
     System.err.println("Error starting Appium: " + e.getMessage()); 

Beachten Sie den Teil mit D:/SDKs/Appium/node_modules/appium/lib/server/main.js? Ich muss das intelligent aufbauen, um die Hardcoding zu entfernen.

Antwort

1

Sie müssen den $ PATH selbst scannen. Hier ist die demo (hosted auf Github)

Der entscheidende Punkt ist:

System.getenv("PATH") 
     .split(System.getProperty("path.separator")) 

Der Rest über jeden Pfad einfach und Suche nach einer Datei namens „Knoten“.

+0

Die .js-Datei befindet sich im Verzeichnis nodeJS, nicht in meinem Java-Projektverzeichnis, von dem ich nicht weiß, wo es sich befindet. Deshalb muss ich den Speicherort der Knoten ausführbar machen. Daher kann ich die .js nicht einfach als Datei instantiieren. Wenn ich gewusst hätte, wo es ist, wäre es leicht gewesen. – evilpenguin

+0

Ich sehe, Sie haben Ihre Antwort aktualisiert, aber Sie haben immer noch nicht den Punkt verstanden. Ich weiß nicht, wo die .js-Datei ist, ich weiß nur, wo es sich auf den ausführbaren Knoten 'node' bezieht. Ich kann es nicht in einem 'File' Objekt einfügen. – evilpenguin

+0

Vielleicht hat die richtige Antwort mit * $ PATH * zu tun. Die Tools * which * und * where * scannen einfach den * $ PATH * für eine ausführbare Datei mit diesem Namen. Das könnte man auch tun. –

Verwandte Themen