6

我正在试验 Java 应用程序的 Linux 功能。我不想为解释器(JVM)添加功能,所以我尝试编写一个简单的包装器(将调试信息打印到标准输出):

#include <stdio.h>
#include <stdlib.h>
#include <sys/capability.h>
#include <unistd.h>

int main(int argc, char *argv[]){
        cap_t cap = cap_get_proc();

        if (!cap) {
                perror("cap_get_proc");
                exit(1);
        }
        printf("%s: running with caps %s\n", argv[0], cap_to_text(cap, NULL));

        return execlp("/usr/bin/java", "-server", "-jar", "project.jar", (char *)NULL);
}

这样,我可以看到为这个可执行文件设置了功能:

./runner: running with caps = cap_net_bind_service+p

getcap显示

runner = cap_net_bind_service+ip

我将功能设置为可继承,所以应该没有问题。但是,java 仍然不想绑定到特权端口。

我收到此错误:

sun/nio/ch/Net.java:-2:in `bind': java.net.SocketException: Permission denied (NativeException)

有人可以帮我解决这个问题吗?

4

2 回答 2

1

尝试使用 1024 以上的端口,或以 root 身份运行。

于 2011-10-08T03:18:27.160 回答
0

任何更新?

您可能会在 Apache Commons-Daemon jsvc 项目中找到一些答案:“...用于使 Java 应用程序更轻松地在 UNIX 上运行的库和应用程序集。”

他们使用功能,即使他们不允许用户选择应用哪个功能,我想是出于可移植性的原因。

于 2013-10-02T14:48:04.137 回答