On 15/04/2015 13:37, Magnus Ihse Bursie wrote:
When this simple program is run:

public class TestSystemVersion {
  public static void main(String[] args) {
System.out.println("1. java.version: " + System.getProperty("java.version")); System.out.println("1. java.runtime.version: " + System.getProperty("java.runtime.version"));
    System.setProperties(null);
System.out.println("2. java.version: " + System.getProperty("java.version")); System.out.println("2. java.runtime.version: " + System.getProperty("java.runtime.version"));
  }
}

The output is:
1. java.version: 1.9.0-internal
1. java.runtime.version: 1.9.0-internal-magnusi_2015_04_02_09_24-b00
2. java.version: 1.9.0-internal
2. java.runtime.version: null

Is this really expected? I find it surprising. I'd have thought that either *both* strings would have been reset, or none.

This behavior stems from the fact that System.setProperties(), when given a null argument, calls initProperties. This is a native method which sets java.version, but not java.runtime.version. However, at system startup, initializeSystemClass() will be called, which apart from initProperties also calls a bunch of other methods to set up initial system properties, for instance sun.misc.Version.init(), which will re-set java.version (even though it is already set at this point), and also set java.runtime.version.
At one point then Mike Duigou was looking into this via JDK-8022854 but I don't think it was ever completed.

-Alan

Reply via email to