0

我有一个 java 程序,它做了一些准备,然后在它准备的内容上调用 Jekyll。Jekyll 是作为 gem 安装在本地 PC 上的 Ruby 程序。在 windows 和 linux 上没问题,但是在 OSX 上运行时,在 eclipse 调试器下,Jekyll 不运行。大概这是因为交互式 shell 问题(Jekyll 在终端上运行良好)。

这是我的java代码:

  DefaultExecutor exec = new DefaultExecutor(); // from org.apache.commons.exec
  exec.setExitValue(0);
  MyFilterHandler pumpHandler = new MyFilterHandler();
  exec.setWorkingDirectory(new File("/Users/grahamegrieve/temp/igs/swissnoso/temp/pages"));

  ProcessBuilder processBuilder = new ProcessBuilder(new String("bash -c jekyll build --destination /Users/grahamegrieve/temp/igs/swissnoso/output"));
  Map<String, String> env = processBuilder.environment();
  Map<String, String> vars = new HashMap<>();
  vars.putAll(env);
  String path = "/Users/grahamegrieve/.gem/ruby/3.1.0/bin:/Users/grahamegrieve/.gem/ruby/3.1.0/bin:/opt/homebrew/opt/ruby/bin:/Users/grahamegrieve/.nvm/versions/node/v17.4.0/bin:/opt/homebrew/bin:/opt/homebrew/sbin:"+env.get("PATH");
  vars.put("PATH", path);
  exec.execute(org.apache.commons.exec.CommandLine.parse("bash -c -i jekyll build --destination /Users/grahamegrieve/temp/igs/swissnoso/output"), vars);

这导致该过程的以下输出:

A subcommand is required.

其次是 Jekyll 的标准文档 - 所以 Jekyll 正在运行但没有获取参数。同样的事情发生在终端:

➜  ~ bash -c jekyll build --destination /Users/grahamegrieve/temp/igs/swissnoso/output  
A subcommand is required. 
jekyll 4.2.1 -- Jekyll is a blog-aware, static site generator in Ruby

Usage:

  jekyll <subcommand> [options]

在终端中,我可以这样做:

➜  ~ bash -c 'jekyll build --destination /Users/grahamegrieve/temp/igs/swissnoso/output'
Configuration file: none
            Source: /Users/grahamegrieve
       Destination: /Users/grahamegrieve/temp/igs/swissnoso/output
 Incremental build: disabled. Enable with --incremental
      Generating... 

因此,当整个命令包含在“”中时,参数可以正常工作。但是将''(或“”)放在java代码中会导致

Jekyll: bash: jekyll build --destination /Users/grahamegrieve/temp/igs/swissnoso/output: No such file or directory

据我所知,这意味着没有名为“Jekyll build ...”的文件。

所以我不知道如何在 OSX 上从我的 java 代码中调用 Jekyll。可能吗?

4

1 回答 1

0

答案就在这里:使用 org.apache.commons.exec.DefaultExecutor 执行 shell 命令

这与 CommandLine 的工作方式以及与 Bash 的交互方式有关。

DefaultExecutor exec = new DefaultExecutor(); // from org.apache.commons.exec
  exec.setExitValue(0);
  MyFilterHandler pumpHandler = new MyFilterHandler();
  exec.setWorkingDirectory(new File("/Users/grahamegrieve/temp/igs/swissnoso/temp/pages"));

  ProcessBuilder processBuilder = new ProcessBuilder(new String("bash -c jekyll build --destination /Users/grahamegrieve/temp/igs/swissnoso/output"));
  Map<String, String> env = processBuilder.environment();
  Map<String, String> vars = new HashMap<>();
  vars.putAll(env);
  String path = "/Users/grahamegrieve/.gem/ruby/3.1.0/bin:/Users/grahamegrieve/.gem/ruby/3.1.0/bin:/opt/homebrew/opt/ruby/bin:/Users/grahamegrieve/.nvm/versions/node/v17.4.0/bin:/opt/homebrew/bin:/opt/homebrew/sbin:"+env.get("PATH");
  vars.put("PATH", path);
  CommandLine cmd = new CommandLine("bash").addArgument("-c").addArgument("Jekyll build --destination /Users/grahamegrieve/temp/igs/swissnoso/output", false);
  exec.execute(cmd, vars);

于 2022-02-11T00:36:37.273 回答