2017-01-22 214 views
2

我有一個簡單的罐子Hello.java:JAVA_TOOL_OPTIONS最大長度

class Hello { 
    public static void main(String[] a) { 
     System.out.println("Hello world!"); 
    } 
} 

我想通過JAVA_TOOL_OPTIONS傳遞一些選項。如果$ JAVA_TOOL_OPTIONS長度的值小於或等於1024,它拾起:

$export JAVA_TOOL_OPTIONS=$(for i in {1..43}; do echo -n "-Dmyapp.opt${i}="123456789" "; done) 
$ echo $JAVA_TOOL_OPTIONS | wc -c 
1023 

java -jar hello.jar 
Picked up JAVA_TOOL_OPTIONS: -Dmyapp.opt1=123456789 -Dmyapp.opt2=123456789 -Dmyapp.opt3=123456789 -Dmyapp.opt4=123456789 -Dmyapp.opt5=123456789 -Dmyapp.opt6=123456789 -Dmyapp.opt7=123456789 -Dmyapp.opt8=123456789 -Dmyapp.opt9=123456789 -Dmyapp.opt10=123456789 -Dmyapp.opt11=123456789 -Dmyapp.opt12=123456789 -Dmyapp.opt13=123456789 -Dmyapp.opt14=123456789 -Dmyapp.opt15=123456789 -Dmyapp.opt16=123456789 -Dmyapp.opt17=123456789 -Dmyapp.opt18=123456789 -Dmyapp.opt19=123456789 -Dmyapp.opt20=123456789 -Dmyapp.opt21=123456789 -Dmyapp.opt22=123456789 -Dmyapp.opt23=123456789 -Dmyapp.opt24=123456789 -Dmyapp.opt25=123456789 -Dmyapp.opt26=123456789 -Dmyapp.opt27=123456789 -Dmyapp.opt28=123456789 -Dmyapp.opt29=123456789 -Dmyapp.opt30=123456789 -Dmyapp.opt31=123456789 -Dmyapp.opt32=123456789 -Dmyapp.opt33=123456789 -Dmyapp.opt34=123456789 -Dmyapp.opt35=123456789 -Dmyapp.opt36=123456789 -Dmyapp.opt37=123456789 -Dmyapp.opt38=123456789 -Dmyapp.opt39=123456789 -Dmyapp.opt40=123456789 -Dmyapp.opt41=123456789 -Dmyapp.opt42=123456789 -Dmyapp.opt43=123456789 
Hello world! 

如果$ JAVA_TOOL_OPTIONS長度值比1024多,它忽略了:

$export JAVA_TOOL_OPTIONS+="$JAVA_TOOL_OPTIONS -Dmyapp.opt44=123456789" 
$ echo $JAVA_TOOL_OPTIONS | wc -c 
2070 

$ java -jar hello.jar 
Hello world! 

從哪裏來呢JAVA_TOOL_OPTIONS字符長度限制來自哪裏? 是否有可能超過1024個字符限制?

+0

從技術上看下面的答案。你爲什麼要傳遞> 1024字符的JAVA_TOOL_OPTIONS?你不能直接將'-D'選項傳遞給你的'java'進程嗎? – dnswlt

+0

@dnswlt我感謝您的幫助!應用程序通過ENTRYPOINT腳本在Docker容器中啓動。腳本(和Dockerfile)提供有限的一組變量。我無法修改它並直接傳遞-D選項。提供者建議使用JAVA_TOOL_OPTIONS。我可能會要求添加JAVA_OPT環境變量,因爲JAVA_TOOL_OPTIONS似乎有限制。 – idobr

回答

4

這是一個有趣的問題!如果您檢查的OpenJDK V7的源代碼,特別是command line argument parser,你會看到:

jint Arguments::parse_options_environment_variable(const char* name, SysClassPath* scp_p, bool* scp_assembly_required_p) { 
    const int N_MAX_OPTIONS = 64; 
    const int OPTION_BUFFER_SIZE = 1024; 
    char buffer[OPTION_BUFFER_SIZE]; 

所以緩衝區大小爲1024個,其中完全匹配證實:-)

你的漂亮的實驗

但是,我不知道,也沒有找到任何官方文件,爲什麼這個限制存在。

+0

感謝您的研究。我很高興爲您頒獎。 – idobr