Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用System.exit从Java Jar返回Perl代码_Java_Perl_Jar_Return Code - Fatal编程技术网

使用System.exit从Java Jar返回Perl代码

使用System.exit从Java Jar返回Perl代码,java,perl,jar,return-code,Java,Perl,Jar,Return Code,因此,我使用perl脚本调用命令,然后获取返回代码: my $command = "java myjar.jar ARG1 ARG2 ARG3 2>&1"; my $result = open2( *Reader, *Writer, $command ) or die "Could not open 2-way pipe: $!\n"; my $result_return_code = $?; 这似乎很管用。然而,在我的一次测试中,它似乎不起作用。我深入到java代码中,这就是打

因此,我使用perl脚本调用命令,然后获取返回代码:

my $command = "java myjar.jar ARG1 ARG2 ARG3 2>&1";
my $result = open2( *Reader, *Writer, $command ) or die "Could not open 2-way pipe: $!\n";
my $result_return_code = $?;
这似乎很管用。然而,在我的一次测试中,它似乎不起作用。我深入到java代码中,这就是打印出来的内容

try {
 ...
}
catch (Exception e) {
  System.out.println("Failed");
  System.exit(99);
}
返回的错误代码不是99,而是0。我现在尝试了dkatzel的编辑,并尝试将代码更改为以下内容:

my $command = "java myjar.jar ARG1 ARG2 ARG3 2>&1";
my $result = open2( *Reader, *Writer, $command ) or die "Could not open 2-way pipe: $!\n";
my $result_return_code = $? >> 8;
但是,我仍然得到一个返回值0。这个改变也改变了我的另一个测试用例,我得到的返回值是65280。。。现在它返回255

嗯。现在,我尝试了Zaid的编辑,它成功了。下面是我的代码的样子(也显示了比以前多一点的代码):

my$command=“java myjar.jar ARG1 ARG2 ARG3 2>&1”;
我的$result\u pid=open2(*Reader,*Writer,$command)或die“无法打开双向管道:$!\n”;
打印写入程序“stdinarg1=var1\n”;
打印写入程序“stdinarg2=var2\n”;
关闭(作者);
我的$result_string=;
关闭(读卡器);
waitpid($result\u pid,0);
我的$result\u return\u code=$?>>8.
我的$result\u return\u code=$?>>8.
在Java
系统中。退出(X)
将返回代码设置为X并立即退出JVM。不管退出调用是在main方法中还是在其他任何地方

根据
$?
实际上是2个值:“高8位反映程序遇到的特定错误情况(程序的exit()值)。低8位反映故障模式”

因此,将代码更改为:

my $result_return_code = $? >> 8;
可能会有用


编辑

“此更改还更改了我的另一个测试用例,其中我得到的返回值为65280…现在返回为255”

是的,255也是-1,这可能是JVM的真正退出代码(查找java代码中的某个地方的
System.exit(-1)
。65000退出代码是由于位移位
$?
造成的。-1将
$?
设置为高8位的所有位设置

关于0的退出代码:


假设进程已经完成。退出代码0通常意味着成功。但是JVM的退出代码非常糟糕。如果代码没有显式调用
System.Exit()
即使抛出异常,JVM也会返回0的退出代码。因此,如果您得到的退出代码为0,并且它确实应该是一个错误,那么java代码中可能有一个bug缺少对System.exit()的调用;

您需要等待子进程使用返回。这是因为
waitpid
设置
$?

状态返回到
$?


这真的很重要吗?任何非零的东西都是失败的。问题是它返回的返回码是0。如果我没有说清楚的话,很抱歉。修复了我原来的帖子以使其更清晰。谢谢你的建议。我尝试将其更改为此,但仍然得到了0。它还更改了我的另一个测试用例。我编辑了我的original post显示发生了什么。
my $result_return_code = $? >> 8;
my $result = open2( *Reader, *Writer, $command )
               or die "Could not open 2-way pipe: $!\n";

do { ... }; # Interact with the process

waitpid( $result, 0 );

my $result_return_code = $? >> 8;