2016-07-29 92 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 *为具有该名称的可执行文件。这是你可以做的。 –