0

我正在尝试使用 Apache commons exec 从 Java 应用程序中启动脚本,并收到以下错误:

Error: Could not find or load main class "-DappEnv=te
org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1)
    at org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:402)
    at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:164)
    at TestRunner.runTest(TestRunner.java:37)
    at TestMain.main(TestMain.java:6)

对于以下代码:

String jOpts = "JAVA_OPTS=\"-DappEnv=te -DsetInstance=true -Dinstance=.01\"";
String command = "/path/to/bin/script.sh -s argVal";
try {
  Map<String, String> procEnv = EnvironmentUtils.getProcEnvironment();
  EnvironmentUtils.addVariableToEnvironment(procEnv, jOpts);
  CommandLine cmdLine = CommandLine.parse(command);
  DefaultExecutor executor = new DefaultExecutor();
  executor.setWorkingDirectory(new File("/path/to"));
  executor.execute(cmdLine, procEnv);
} catch (Exception e) {
  e.printStackTrace();
}

该错误使我陷入循环,因为它似乎正在拆分环境变量的引用值并按该名称查找类,而不是使用环境变量运行命令。对于它的价值,以下在 bash 中执行得很好:

JAVA_OPTS="-DappEnv=te -DsetInstance=true -Dinstance=.01" /path/to/bin/script.sh -s argVal

任何人都可以提供一些关于为什么引用的值在空格上被分割的见解,和/或为什么它正在寻找值中的主类JAVA_OPTS?我是否正确使用环境贴图?

4

1 回答 1

0

部分问题是 exec 将自己的引号添加到JAVA_OPTS. 如果值周围没有引号,则环境变量设置得很好:

String jOpts = "JAVA_OPTS=-DappEnv=te -DsetInstance=true -Dinstance=.01";

该命令的格式也错误。传递给的参数commandLine.parse()应该只是要运行的程序的名称:

String command = "/path/to/bin/script.sh";
CommandLine cmdLine = CommandLine.parse(command);

其余参数需要添加addArgument()

cmdLine.addArgument("-s");
cmdLine.addArgument("argVal");
于 2014-06-18T20:29:14.240 回答