2010-06-14 72 views
6

我正在試驗Java應用程序的Linux功能。我不想來增加功能,以解釋器(JVM),所以我試着寫一個簡單的包裝(帶打印到標準輸出的調試信息):功能與Linux和Java

#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) 

有人可以幫我解決這個問題?

+0

「java仍然不想綁定到特權端口」:你會得到什麼錯誤信息?在嘗試綁定到特權端口之前,您的JRE實現可能會對「uid == 0」進行自己的(錯誤)檢查。 – 2010-06-14 11:40:27

回答

1

嘗試使用1024以上的端口,或者以超級用戶身份運行。

+1

1024以下的端口是有特權的,只能由root訪問。 – 2011-10-08 03:20:41

0

有沒有更新?

您可以在Apache Commons-Daemon jsvc項目中找到一些答案:「...用於使Java應用程序更容易在UNIX上運行的庫和應用程序集。」

他們使用的能力,即使他們沒有允許用戶選擇應用哪一個,對於便攜性的原因,我想。