这个属性确实设置的比较隐(坑)蔽(爹),我通过lldb定位到了它是在哪被加入SystemProperty的。我debug的是OpenJDK 9的源码,事先说明:我是使用:
lldb -- ./java -cp MainClass
这里,java.class.path属性值被加入到了系统属性链表。详情参考:
(lldb) b arguments.cpp:3248
Breakpoint 12: where = libjvm.dylib`Arguments::parse_each_vm_init_arg(JavaVMInitArgs const*, bool*, Flag::Flags) + 8230 at arguments.cpp:3248, address = 0x000000010229b816
(lldb) r
There is a running process, kill it and restart?: [Y/n] y
Process 17116 exited with status = 9 (0x00000009)
Process 17161 launched: './java' (x86_64)
Process 17161 stopped
* thread #6, stop reason = breakpoint 12.1
frame #0: 0x000000010229b816 libjvm.dylib`Arguments::parse_each_vm_init_arg(args=0x00007000048b8da0, patch_mod_javabase=0x00007000048b883f, origin=COMMAND_LINE) at arguments.cpp:3248
3245 continue;
3246 }
3247
-> 3248 if (!add_property(tail)) {
3249 return JNI_ENOMEM;
3250 }
3251 // Out of the box management support
(lldb) p tail
(const char *) $69 = 0x00000001004060c2 "java.class.path=/Users/etin/IdeaProjects/JDKPlayer/out/production/JDKPlayer"
(lldb) bt
* thread #6, stop reason = breakpoint 12.1
* frame #0: 0x000000010229b816 libjvm.dylib`Arguments::parse_each_vm_init_arg(args=0x00007000048b8da0, patch_mod_javabase=0x00007000048b883f, origin=COMMAND_LINE) at arguments.cpp:3248
frame #1: 0x0000000102299754 libjvm.dylib`Arguments::parse_vm_init_args(java_tool_options_args=0x00007000048b8990, java_options_args=0x00007000048b8958, cmd_line_args=0x00007000048b8da0) at arguments.cpp:2719
frame #2: 0x000000010229f94a libjvm.dylib`Arguments::parse(initial_cmd_args=0x00007000048b8da0) at arguments.cpp:4406
frame #3: 0x0000000102ed210a libjvm.dylib`Threads::create_vm(args=0x00007000048b8da0, canTryAgain=0x00007000048b8d0b) at thread.cpp:3538
frame #4: 0x000000010293c1ce libjvm.dylib`JNI_CreateJavaVM_inner(vm=0x00007000048b8e98, penv=0x00007000048b8e90, args=0x00007000048b8da0) at jni.cpp:3937
frame #5: 0x000000010293c0ac libjvm.dylib`::JNI_CreateJavaVM(vm=0x00007000048b8e98, penv=0x00007000048b8e90, args=0x00007000048b8da0) at jni.cpp:4032
frame #6: 0x0000000100005e40 java`InitializeJVM + 304
frame #7: 0x000000010000501c java`JavaMain + 172
frame #8: 0x00007fff9ed0d93b libsystem_pthread.dylib`_pthread_body + 180
frame #9: 0x00007fff9ed0d887 libsystem_pthread.dylib`_pthread_start + 286
frame #10: 0x00007fff9ed0d08d libsystem_pthread.dylib`thread_start + 13