2016-07-29 90 views
1

我在命令行Java應用程序中調用nodeJS可執行文件。由於可執行文件位於$PATH變量中的一個位置,因此可以簡單地將其稱爲node。但是,我必須提供一個參數(要運行的.js文件),如果我提供了作爲node可執行文件的相對路徑的參數,那麼nodeJS會拋出無法找到.js文件的錯誤。

因此,我正在尋找的是正在運行的node可執行文件的絕對路徑,然後編譯.js文件的絕對路徑,我必須將其作爲參數添加到node命令中。

有沒有一種方法可以在Java平臺不可知?我意識到我可以運行where node,獲取輸出並從那裏開始,但我不想硬編碼特定於操作系統的命令。

這裏是我到目前爲止的代碼:

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()); 

通知與D:/SDKs/Appium/node_modules/appium/lib/server/main.js的一部分嗎?我需要以智能的方式構建它以消除硬編碼。

回答

1

您必須爲自己掃描$ PATH。 這裏的demo(託管在GitHub上)

關鍵的一點是:

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

剩下的就是簡單的在每個路徑和搜索名爲「節點」的文件。

+0

.js文件位於nodeJS目錄中,不在我的Java項目目錄中,我不知道它在哪裏。這就是爲什麼我需要獲取節點可執行文件的位置。因此,我不能將.js作爲一個文件實例化。如果我知道它在哪裏,那將很容易。 – evilpenguin

+0

我看到你已經更新了你的答案,但你還沒有明白。我不知道.js文件的位置,我只知道它與「node」可執行位置相關的位置。我不能在'File'對象中實例化它。 – evilpenguin

+0

也許正確答案與* $ PATH *有關。 工具* *和*其中*只是掃描* $ PATH *爲具有該名稱的可執行文件。這是你可以做的。 –