&1"; my $result = open2( -6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:45:33 24 4
gpt4 key购买 nike

所以我使用 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。

好的。现在我尝试了扎伊德的编辑并且它有效。我的代码如下所示(还显示了比以前多一点的代码):

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;

最佳答案

在 Java 中 System.exit(X) 会将返回码设置为 X 并立即退出 JVM。对 exit 的调用是在 main 方法中还是在其他任何地方都没有关系。

根据perldoc $? 实际上是 2 个值:“高八位反射(reflect)了程序遇到的特定错误情况(程序的 exit() 值)。低八位反射(reflect)了失败模式”

因此将您的代码更改为:

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() 的调用;

关于java - Perl 使用 System.exit 从 Java Jar 返回代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23367419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com