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

时间:2014-04-29 14:22:40

标签: 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代码,这就是打印的内容。

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";
my $result_pid = open2( *Reader, *Writer, $command ) or die "Could not open 2-way pipe: $!\n";

print Writer "stdinarg1=var1\n";
print Writer "stdinarg2=var2\n";
close(Writer);

my $result_string = <Reader>;
close(Reader);

waitpid($result_pid, 0);
my $result_return_code = $? >> 8;

my $result_return_code = $? >> 8;

2 个答案:

答案 0 :(得分:4)

在Java中System.exit(X)将返回代码设置为X并立即退出JVM。退出调用是在main方法中还是在其他任何地方都无关紧要。

根据perldoc $?实际上是2个值:“高8位反映程序遇到的特定错误条件(程序的exit()值)。低8位反映模式失败“

所以将代码更改为:

my $result_return_code = $? >> 8;

可能会奏效。


修改

“此更改也改变了我的其他一个测试用例,其中我的返回值为65280 ......现在它返回为255”

是255也是-1,这可能是来自JVM的真正退出代码(在java代码中的某处查找System.exit(-1)。65,000退出代码是因为位移$?。 -1将$?设置的所有位设置为高8位。

关于退出代码0:

假设该过程已经完成。退出代码0通常意味着成功。但是JVM在退出代码方面非常糟糕。如果代码没有显式调用System.exit(),那么JVM将返回退出代码为0 即使例外是。因此,如果您获得的退出代码为0并且它确实应该是错误,则可能存在错误,Java代码中可能存在缺少对System.exit()的调用的错误;

答案 1 :(得分:3)

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

  

状态在$?

中返回
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;