Proposal: JDK-8231640 - (prop) Canonical property storage

Magnus Ihse Bursie magnus.ihse.bursie at oracle.com
Wed Aug 25 12:03:05 UTC 2021


Hi Jaikiran,

I'm glad to see this issue finally getting some love and attention! :)

I don't fully support those "inclinations" that say that the old API 
should not change. I think keeping the old random order of store() would 
mean a missed chance to do good, otherwise a lot of Java programs will 
never get reproducible output of property files. We do have a chance of 
helping the community, in a single stroke, to make lots of application 
(more) reproducible without any programmer effort. There is a growing 
community pushing for reproducible builds (see e.g. 
https://reproducible-builds.org). Java programs tend to have 
reproducibility issues due to several cases of non-determinism in the 
Java platform, and I really think we should try to rectify that.

The specification for store() does not say anything about the order 
properties are written, so I think the implementation is free to change 
this to a deterministic order. As long as files written by an updated 
version of store() can be read by old versions (and vice versa) there 
will be no compatibility issue in Java programs. And since the old 
(current...) order is non-deterministic, it seems exceedingly unlikely 
that any external program depends on the order currently generated by 
store().

The problem is with the time stamp, which the spec states should be 
present. I understand why changing this might need a new method. But I 
think we should try to steer users to this new method. Otherwise it is 
likely not to be used by those who should use it (the programmers) to 
the detrimental effect of users who get properties file which change for 
no good reason. Having an "attractive" name is definitely part of that. 
The name should scream "use me as a first hand choice for storing 
properties to a file". I don't really get that feeling from 
storeCanonical().

> One thing I do remember is the JDK build (through the make files) 
> would have certain Java code it would call to do some build steps. Is 
> there a easy way to find all such build related Java files within the 
> JDK? I would like to see if there are any references/calls to this 
> method from those build files. I am doing some searches myself, but 
> knowing where to search will give me more confidence that I haven't 
> missed out any.

The java buildtool sources are located in the "make" directory, more 
specifically in "make/jdk/src", "make/langtools/src" and "make/src" 
(yeah, I know -- a cleanup is way overdue). I did a quick search now but 
could not find any references to Properties.store().

I'm trying to remember if we create properties during the build... We 
have several instances where .properties files in the Java source code 
are converted to hard-coded classes (for performance), and other where 
.properties files are copied verbatim. Ah, right, they are "cleaned" 
beforehand. We used to do this by a Java program, but nowadays they are 
mangled by sed. I think replacing that sed script with a trivial Java 
program doing storeCanonical() would be on the list of things to do. I 
can assist with that, when you are starting to get your implementation done.

We might also write something as part of the jlink process that gets 
embedded in the resulting jimage; not quite sure about that. You should 
find that code in the normal src/ codebase though.

/Magnus



More information about the build-dev mailing list