很多古早的java启动参数其实是不规范的,只是因为CMD语法不严格才看起来不会出异常。但PowerShell语法更严格,很多错误因此暴露出来。最典型的就是java启动时的-D参数,传统常常出现类似于这样的写法:
jre\bin\java.exe -agentpath:.\jre\bin\kdrawLoader.dll -Djava.net.preferIPv4Stack=true -Djava.util.Arrays.useLegacyMergeSort=true -jar app2.jar
注意到-D和后面的名称之间没有任何分隔符,这种语法不仅可读性差,容易让人以为“Djava”是一个整体单词,而且在PowerShell中实际上不允许这样使用。这实际上是利用了CMD语法不严谨的特性产生的历史遗留问题。PowerShell要求-D之后的参数必须引号:
.\jre\bin\java.exe -agentpath:.\jre\bin\kdrawLoader.dll -D"java.net.preferIPv4Stack=true" -D"java.util.Arrays.useLegacyMergeSort=true" -jar app2.jar
如果不加引号,PowerShell实际上会和我们人类的第一反应一样将“Djava”视为一个整体单词,从而产生错误。典型地,java会将Djava后面的名称当作一个主类名称,从而报“找不到或无法加载主类”错误!