JAVA_TOOL_OPTIONS最大长度

4

我有一个简单的带有 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个字符的限制?

关于为什么会发生这种情况,从技术上讲,可以参考我的下面的回答。你为什么想要传递超过1024个字符的JAVA_TOOL_OPTIONS呢?难道你不能直接将“-D”选项传递给你的“java”进程吗? - dnswlt
@dnswlt,非常感谢您的帮助!应用程序通过ENTRYPOINT脚本在Docker容器中启动。该脚本(和Dockerfile)仅提供有限的变量。我无法修改它并直接传递-D选项。提供者建议使用JAVA_TOOL_OPTIONS。由于JAVA_TOOL_OPTIONS似乎有限制,我可能会请求添加JAVA_OPT环境变量。 - idobr
1个回答

9

这是一个有趣的问题!如果你检查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,这与您的实验结果完全相符 :-)

然而,我不知道为什么存在这个限制,也没有找到任何官方文档来解释。


感谢您的研究。我很高兴向您授予赏金。 - idobr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接