我尝试使用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
的值中寻找主类?我是否正确使用了环境贴图?
答案 0 :(得分: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");