【问题标题】:mvn command not found when running python script from Java从 Java 运行 python 脚本时找不到 mvn 命令
【发布时间】:2017-07-22 03:11:56
【问题描述】:

目前我可以使用Process 在java 中启动一个python 程序。

问题是,Process 无法识别 python 程序中的mvn 命令,尽管我已经正确安装了 maven 并且能够从终端运行 python 程序。

这就是我使用Process的方式:

public static String runCommand(String directory, List<String> command) {

    ProcessBuilder processBuilder = new ProcessBuilder(command).directory(new File(directory));

    processBuilder.redirectErrorStream(true);

    Process process;
    String output = null;
    try {
        process = processBuilder.start();


        //Pause the current thread until the process is done
        process.waitFor();

        //When the process does not exit properly
        if (process.exitValue() != 0) {

            //Error
            System.out.println("command exited in error: " + process.exitValue());

            //Handle the error
            return readOutput(process);
        }else {

            output = readOutput(process);
            System.out.println(output);
        }

    } catch (InterruptedException e) {
        System.out.println("Something wrong with command: " +e.getMessage());

    } catch (IOException e) {
        System.out.println("Something wrong with command: " +e.getMessage());
    }

    return output;
}`

驱动代码:

    List<String> csi = new ArrayList<>();
    CSI_PATH = getClass().getResource("/python/csi").getPath();
    System.out.println("CSI path:" + CSI_PATH);


    //Construct the argument
    csi.add(CSI_PATH);
    //argument for the csi program
    csi.add(pre_hash);
    csi.add(post_hash);

    String csi_output = Command.runCommand(project_directory, csi);

    System.out.println(csi_output);

我可以在 Java 中做些什么来让 Process 在 python 程序中识别 mvn 吗?

csi程序的相关部分:

os.sys_call("git checkout " + commit_hash)
os.sys_call("mvn clean")
bin_path = mvn.path_from_mvn_call("outputDirectory")
src_rel_path = mvn.path_from_mvn_call("sourceDirectory")


def path_from_mvn_call(env):
    if env not in ["sourceDirectory", "scriptSourceDirectory", "testSourceDirectory", 
               "outputDirectory", "testOutputDirectory", "directory"]:
        raise ValueError("incorrect env var: " + env)
    mvn_cmd = "mvn help:evaluate -Dexpression=project.build." + env + " | grep ^/"
    return subprocess.check_output(mvn_cmd, shell=True).strip()

def sys_call(cmd, ignore_bad_exit=False):
    ret = subprocess.call(cmd, shell=True)
    if ret != 0:
        print "\n-- << non-zero exit status code >> --"
        if ignore_bad_exit:
            print "Exit from command: \n\t" + cmd
            print "But we can safely ignore such non-zero exit status code this time.\n"
        else:
            print "Error in command: \n\t" + cmd + "\n"
            raise SystemExit("system exit: " + str(ret))

提前谢谢!

编辑: 我试过这个帖子 How do I launch a java process that has the standard bash shell environment?

所以我把代码改成

      //Construct the argument
      csi.add("/bin/bash");
      csi.add("-l");
      csi.add("-c");
      csi.add("\"" + csi_path + " " + pre_hash+ " " + post_hash + "\"");
      String csi_output = Command.runCommand(project_directory, csi);

但即便如此,命令也会退出 127,这意味着 Value 127 is returned by your shell /bin/bash when any given command within your bash script or on bash command line is not found in any of the paths defined by PATH system environment variable.

如果我在java中运行/bin/bash -l -c "mvn --version",它仍然退出127。

【问题讨论】:

  • 请出示相关代码。
  • @OldProgrammer 谢谢提醒,我已经添加了相关代码。

标签: java linux shell maven


【解决方案1】:

Python 从您的终端继承所有环境。从 Python 生成的子进程应该从父进程继承所有环境。所以我不确定为什么会发生错误mvn。 你可以试试python子进程:

import subprocess
args = ['mvn', '-version']
process = subprocess.Popen(args, stdout=subprocess.PIPE)

import subprocess
args = ['mvn', '-version']
process = subprocess.Popen(args,shell=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 2016-09-27
    • 2014-03-18
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多