Why is java -version implemented in Java?

Michael Bien mbien42 at gmail.com
Tue Nov 24 02:27:45 UTC 2020


'java --dry-run' will currently print the help (and exit with 1) if no 
jar/mainclass/etc has been provided. Maybe this could be omitted to make 
it script friendlier. That might be the reason why i have seen 'java 
-Xshare:on -version' in scripts before, instead of 'java -Xshare:on 
--dry-run' which is more descriptive.

i don't think -v is taken yet. This might be the way out to add a fast 
path, while -version (and --version) would remain unchanged for printing 
instance specific settings (sharing, mixed mode, etc) additionally to 
the version.

(just an idea)

best regards,
michael

On 22.11.20 06:57, Thomas Stüfe wrote:
> Thanks Michael, that's an important point.
>
> So when I half-jokingly wrote that "-version" is used as a cheap 
> first-line VM test I was not wrong, and not only OpenJDK developers do 
> that. People seem to rely on "-version" parsing arguments and 
> initializing the JVM. Which also would prevent us from modifying 
> command line options to save initialization time, e.g. adding -Xint.
>
> Pity. I guess we could run JVM initialization and still cut out the 
> actual invocation of VersionProps.java and just print all those infos 
> from native code within the hotspot. But I'm not sure how much this 
> would actually save.
>
> Cheers, Thomas
>
>
> On Fri, Nov 20, 2020 at 11:50 PM Michael Bien <mbien42 at gmail.com 
> <mailto:mbien42 at gmail.com>> wrote:
>
>     On 20.11.20 20:44, Thomas Stüfe wrote:
>     > On Fri, Nov 20, 2020 at 7:39 PM Volker Simonis
>     <volker.simonis at gmail.com <mailto:volker.simonis at gmail.com>>
>     > wrote:
>     >
>     >> On Fri, Nov 20, 2020 at 7:08 PM Alan Bateman
>     <Alan.Bateman at oracle.com <mailto:Alan.Bateman at oracle.com>>
>     >> wrote:
>     >>> On 20/11/2020 16:22, Thomas Stüfe wrote:
>     >>>> Hi,
>     >>>>
>     >>>> java -version seems to be called by scripts very frequently
>     to get the
>     >> java
>     >>>> version. Folks complain about the time that takes.
>     >>>>
>     >>>> I always wondered, why is this implemented in java? Which
>     requires the
>     >>>> whole jvm machinery to start up just to print the version
>     information.
>     >>>>
>     >>>> VersionProps.java seems not to be very complex; that
>     information could
>     >> have
>     >>>> been baked into the launcher, or the hotspot.
>     >>>>
>     >>>> Or is using 'java -version' as a simple VM test just too
>     convenient?
>     >>>>
>     >>> The alternative to scripts running `java -version` is to
>     examine the
>     >>> `release` file in the top-level directory. Could the scripts
>     that you've
>     >>> encountered be changed to look at that instead?
>     >> That's an alternative but not the answer to the question :)
>     >>
>     >>
>     > Yes, I was hoping for some background information about why we do it
>     > this way.
>     >
>     > I know about the "release" file, but this does not seem like an
>     obvious
>     > solution. I see this file mentioned as a way to quickly get the java
>     > release info, but it seems so strange and non-obvious. I feel
>     bad that
>     > users have to even do that.
>     >
>     > Also, to me, that file does not seem to correspond clearly with the
>     > -version information.
>     >
>     >
>     >> I'm also not sure how "common" or "standard the "release" file
>     is? I
>     >> know at least two popular distributions which don't have that file
>     >> while "-version" seems to be a documented and supported option.
>     >>
>     >> I think there's probably a lot of history and legacy around
>     "-version"
>     >> and it's implementation. It actually prints "many" versions,
>     e.g. the
>     >> VM version, the class library version, etc.  Most of the "-version"
>     >> output is also exported as system properties and as such only
>     >> "generated" at runtime.
>     >>
>     >> Maybe one solution could be to implement a short-cut into OpenJDK's
>     >> standard launcher to use the information from the "release" file if
>     >> that is present? That should be pretty safe as the times when you
>     >> could simple swap the VM in a JDK release are long gone :)
>     >>
>     >>
>     > An even simpler way could be just to bake the release information as
>     > strings into the java launcher and print those. No need to even
>     open and
>     > parse that file. j.l.VersionProps.java gets generated from a
>     template, a
>     > C-file with strings could be generated the same way.
>     >
>     > But I am sure it's not that easy and I overlook something. Hence my
>     > question.
>
>     java -version does more than just printing static version Strings. It
>     prints if class data sharing is active and which mode the JIT is in
>     (mixed mode by default).
>
>     jdk-15.0.1_oracle/bin/java -version
>     openjdk version "15.0.1" 2020-10-20
>     OpenJDK Runtime Environment (build 15.0.1+9-18)
>     OpenJDK 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing)
>
>
>     I am (ab)using it sometimes to test JDK features when i forget which
>     distribution has what enabled.
>
>     java -Xshare:on -version
>
>     is going to fail if CDS is not properly set up.
>
>
>     java -XX:+UseShenandoahGC -version
>
>     is going to fail if its an Oracle JDK
>
>     ...
>
>
>     I just wanted to mention this because i might not be the only one
>     using
>     -version as --dry-run equivalent.
>
>     best regards,
>
>     michael
>
>
>     >
>     > Cheers, Thomas
>
>



More information about the jdk-dev mailing list