我有一个jar说test.jar有TestJar作为它的主类,一个shell脚本jar_executor.sh和一个java文件。如果我们传递1作为参数,我的test.jar将返回1,如果我们传递任何其他值,则返回2。 我的shell脚本正在执行test.jar,如下所示
#!/usr/bin/ksh
java TestJar 1 -cp test.jar
return_code=$?
exit $return_code
在java文件中,我正在创建一个进程并执行shell脚本并将其exitvalue与以下代码
一起使用Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(sh jar_executor.sh);
int exitVal = process.waitFor();
System.out.println(exitVal);
这个exitVal变量应该按照我们传递的参数打印1或2,但每次打印255。
如果我在shell脚本中使用echo $return_code
,那么我将获得正确的值。
请帮助我为什么我用exit
得到值255。在此先感谢!!!
答案 0 :(得分:2)
255或-1是应用程序定义的退出代码,您必须阅读代码才能知道它的含义。
正常退出的Java应用程序,返回0,如果抛出异常,则返回1.
答案 1 :(得分:2)
转到工作区库workspace.metadata.plugins \ org.eclipse.e4.workbench 并删除工作台文件:)。之后你可以重启eclipse
答案 2 :(得分:0)
看起来它可能是一个Java错误。其他人报告的问题类似于你所看到的;见Java bug report。 Java开发人员认为没有错误,但我很怀疑。 JRE用于从生成的进程获取返回值的代码很多,如果存在竞争条件或其他并发错误,我不会感到惊讶。
我猜测如果生成的进程很快退出,则JRE无法捕获返回代码。如果我的怀疑是正确的,将sleep 1
添加到您的shell脚本将使其正常工作。
答案 3 :(得分:0)
您的shell脚本未正确调用java:
java TestJar 1 -cp test.jar
在提及主类名之前,需要设置java命令的选项。主类名后面的所有参数都是主类的参数,不再是java VM的选项。所以在你的情况下没有为java指定类路径。执行脚本时出现以下错误消息:错误:无法找到或加载主类TestJar 。要修复,您只需要在jar_executor.sh脚本中重新排序参数:
java -cp test.jar TestJar 1
我无法在我的电脑上重现255,所以我只能猜测它来自哪里:当你的java命令无法加载主类或你的korn shell时,你的java命令会返回错误代码而不是1(/ usr) / bin / ksh)在脚本中止时设置此返回值。
以下是我使用的所有来源:
jar_executor.sh
#!/bin/sh -e
java -cp test.jar TestJar 2
return_code=$?
exit $return_code
TestJar.java
public class TestJar {
public static void main(final String[] args) {
System.exit(Integer.parseInt(args[0]));
}
}
JarRunner.java
import java.io.IOException;
public class JarRunner {
public static void main(final String[] args) throws IOException, InterruptedException {
final Runtime runtime = Runtime.getRuntime();
final Process process = runtime.exec("sh jar_executor.sh");
final int exitVal = process.waitFor();
System.out.println(exitVal);
}
}
当我现在运行java -cp bin JarRunner
时,我按预期获得输出 2 。
答案 4 :(得分:-1)
调用脚本可能不对。尝试:
Process process = runtime.exec("sh -c jar_executor.sh");
请注意“-c”标志,表示您正在调用shell来执行命令。