我有一个带Hello.java的简单jar:
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个字符限制?
这是一个有趣的问题!如果检查OpenJDK v7的源代码,特别是命令行参数解析器,您将看到:
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,这与您的好实验确认完全匹配:-)
但是,我不知道并且没有找到任何关于为什么存在此限制的官方文档.