On Nov 29, 2010, at 10:13 PM, David Schlosnagle wrote:

On Mon, Nov 29, 2010 at 5:44 PM, Kelly O'Hair <kelly.oh...@oracle.com> wrote:

Need reviewers and comments:
6989472: Provide simple jdk identification information in the install image
 http://cr.openjdk.java.net/~ohair/openjdk7/jdk_release/webrev/

With JDK6 Updates we purposely resisted many rebranding changes that could impacted customers, however at one point we had accidently changed the Windows DLL/EXE
COMPANY value thinking that no one would be looking at it.
We were wrong and this change cause Eclipse failures, so we are looking for a solution, see:
  https://bugs.eclipse.org/bugs/show_bug.cgi?id=321390
So we went back and change JDK6 Updates back the way it was, and learned a valuable lesson.

But we have and will change JDK7 in this regard, so we wanted a better way for an app to know what it had it's hands on without using platform specific information in the binary files.

The above change creates a small text file called "jdk.release" at the top of the install image with some basic values that could help direct any app using the jdk in constructing a command line or even being assured that this jdk install image will even work on your existing system. In the Eclipse case it was looking for "Sun", but I suspect it really wanted to know if the VM was "Hotspot" because I think it was trying to set a Hotspot specific PermGen option. In any case I think this jdk.release file should provide the necessary answers in the future.

The make variable COMPANY_NAME determines the vendor name during a build,
so a Linux 64bit build from a make command line like:
  make COMPANY_NAME="Test Company Name"
should result in a jdk.release file that looks something like:

os.name = Linux
os.version = 2.6
os.arch = amd64
java.vendor = Test Company Name
java.version = 1.7.0-internal
java.vm.vendor = Test Company Name
java.vm.name = Hotspot(TM)
java.vm.version = 20.0-b02

A formal Oracle jdk7 EA build on Linux 64bit should look something like:

os.name = Linux
os.version = 2.6
os.arch = amd64
java.vendor = Oracle Corporation
java.version = 1.7.0-ea
java.vm.vendor = Oracle Corporation
java.vm.name = Hotspot(TM)
java.vm.version = 20.0-b02

Comments are welcome. Although, polite constructive comments are probably more what I'd like to see. ;^)

-kto


Kelly,

Having been on the other side of the fence writing JVM independent
launchers and startup scripts, I can attest to the value of having a
standardized method of identifying a given JDK/JRE, so I don't want to
be negative and discourage you from pushing OpenJDK forward.
Unfortunately, if the intention is to truly allow identification of
any JDK/JRE and its underlying JVM so that the proper JVM specific
launcher arguments can be set, I'd think this file would need to
become part of the Java SE specification so that all vendors conform
to the same well-known file location, file format, and minimum
property set (similar to the minimum runtime system property set
defined by java.lang.System.getProperties() [1] [2]), or by
standardizing the output of the recently added -XshowSettings flag [3]
[4]. Are there any plans to include such standardizations in JSR 336
for Java SE 7?

I had not even considered it. I assumed this would be an optional file that if it existed, would have some minimal information to help direct the tools. The identification of the JVM was very loose, essentially I just wanted to be
able to identify the implementation, and in general, given multiple VM's
it would be difficult to identify in a static way what VM you would get at
runtime.


The most valuable property that Eclipse and others are looking for is
java.vm.name, and this isn't a static compile time constant property
causing this catch-22. Instead it is dependent on the underlying
runtime JVM (e.g. server, client, jrockit, etc.) which in turn is
determined by the launcher arguments. Hardcoding java.vm.name to
"HotSpot(TM)" seems a little dirty and inconsistent to me. The vendor
specific jvm.cfg defines the available JVMs for a given architecture,
but even that file states that the file and format are unsupported and
will go away in the future. I'm also curious how the java.vm.name
value will change as more of JRockit is incorporated into OpenJDK.

Understood. Mark has pointed out another idea, I'll revise my webrev and
provide more details.

Other properties such as os.* are also runtime system specific rather
than static compile time properties so these could be misinterpreted.

The os.name is static in the way I have defined it, it's not a specific OS as
much as a OS family name. The os.version is meant as a minimum number
so that you could potentially avoid running jdk7 on a Windows 2000 system. The os.arch was meant as a minimal arch, if set to x64 it would imply that there
are no 32bit x86 binaries in this install image.
I had hoped to make some of these identical to the runtime Java properties, but I'm becoming convinced that they are different, and maybe my names should also be
different, like minimum.os.name etc.


I'm assuming the format of the file would be the typical
java.util.Properties format, so I'd prefer naming the file
jdk.properties or something to that effect. I'm also including a few

I am very reluctant to call this a properties file in that it won't be read in at startup
and it's values have no impact on the java install.

snippets below of java.lang.System.getProperties() from various
environments that seemed potentially interesting for use in a
cross-platform JVM launcher. One interesting difference is that
OpenJDK does not include "HotSpot(TM)" in the java.vm.name string. Is
this due to trademark restrictions for OpenJDK?

I really appreciate this data, thank you, very helpful.


Fortunately, the removal of Perm Gen in HotSpot improves the situation
as it is one less critical non-standard VM argument to specify!

Yeah, oh well. I'm sure some other VM specific options will be needed someday. ;^)

-kto


- Dave

References:
[1] 
http://download.oracle.com/javase/6/docs/api/java/lang/System.html#getProperties()
[2] 
http://download.oracle.com/docs/cd/E15289_01/doc.40/e15062/sysprop.htm#i999740
[3] http://markmail.org/message/mqluo6kj3d2haizg
[4] http://hg.openjdk.java.net/jdk7/tl-gate/jdk/rev/32f3094b2c73


** OpenJDK 7 jdk7/jdk7 from November 29, 2010 on Ubuntu 10.04 Linux x86 **
java.runtime.name = OpenJDK Runtime Environment
java.runtime.version = 1.7.0-internal-david_2010_11_29_22_09-b00
java.specification.name = Java Platform API Specification
java.specification.vendor = Sun Microsystems Inc.
java.specification.version = 1.7
java.vendor = Sun Microsystems Inc.
java.vendor.url = http://java.sun.com/
java.vendor.url.bug = http://java.sun.com/cgi-bin/bugreport.cgi
java.version = 1.7.0-internal
java.vm.info = mixed mode
java.vm.name = OpenJDK Server VM
java.vm.specification.name = Java Virtual Machine Specification
java.vm.specification.vendor = Sun Microsystems Inc.
java.vm.specification.version = 1.0
java.vm.vendor = Sun Microsystems Inc.
java.vm.version = 20.0-b03
os.arch = i386
os.name = Linux
os.version = 2.6.32-23-generic

** OpenJDK 7 bsd-port from November 13, 2010 on Mac OS X 10.6.5 **
java.runtime.name = OpenJDK Runtime Environment
java.runtime.version = 1.7.0-internal-david_2010_11_16_20_46-b00
java.specification.name = Java Platform API Specification
java.specification.vendor = Oracle Corporation
java.specification.version = 1.7
java.vendor = Oracle Corporation
java.vendor.url = http://java.oracle.com/
java.vendor.url.bug = http://java.sun.com/cgi-bin/bugreport.cgi
java.version = 1.7.0-internal
java.vm.info = mixed mode
java.vm.name = OpenJDK 64-Bit Server VM
java.vm.specification.name = Java Virtual Machine Specification
java.vm.specification.vendor = Oracle Corporation
java.vm.specification.version = 1.0
java.vm.vendor = Oracle Corporation
java.vm.version = 20.0-b02
os.arch = amd64
os.name = Darwin
os.version = 10.5.0

** Apple JDK 1.6.0_22 on Mac OS X 10.6.5 **
java.runtime.name = Java(TM) SE Runtime Environment
java.runtime.version = 1.6.0_22-b04-307-10M3261
java.specification.name = Java Platform API Specification
java.specification.vendor = Sun Microsystems Inc.
java.specification.version = 1.6
java.vendor = Apple Inc.
java.vendor.url = http://www.apple.com/
java.vendor.url.bug = http://bugreport.apple.com/
java.version = 1.6.0_22
java.vm.info = mixed mode
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
java.vm.specification.name = Java Virtual Machine Specification
java.vm.specification.vendor = Sun Microsystems Inc.
java.vm.specification.version = 1.0
java.vm.vendor = Apple Inc.
java.vm.version = 17.1-b03-307
os.arch = x86_64
os.name = Mac OS X
os.version = 10.6.5

** Oracle JDK 1.6.0_22 on Windows XP SP3 **
java.runtime.name = Java(TM) SE Runtime Environment
java.runtime.version = 1.6.0_22-b04
java.specification.name = Java Platform API Specification
java.specification.vendor = Sun Microsystems Inc.
java.specification.version = 1.6
java.vendor = Sun Microsystems Inc.
java.vendor.url = http://java.sun.com/
java.vendor.url.bug = http://java.sun.com/cgi-bin/bugreport.cgi
java.version = 1.6.0_22
java.vm.info = mixed mode, sharing
java.vm.name = Java HotSpot(TM) Client VM
java.vm.specification.name = Java Virtual Machine Specification
java.vm.specification.vendor = Sun Microsystems Inc.
java.vm.specification.version = 1.0
java.vm.vendor = Sun Microsystems Inc.
java.vm.version = 17.1-b03
os.arch = x86
os.name = Windows XP
os.version = 5.1

** Sun/Oracle JDK 1.6.0_20 on Solaris 10 **
java.runtime.name = Java(TM) SE Runtime Environment
java.runtime.version = 1.6.0_20-b02
java.specification.name = Java Platform API Specification
java.specification.vendor = Sun Microsystems Inc.
java.specification.version = 1.6
java.vendor = Sun Microsystems Inc.
java.vendor.url = http://java.sun.com/
java.vendor.url.bug = http://java.sun.com/cgi-bin/bugreport.cgi
java.version = 1.6.0_20
java.vm.info = mixed mode
java.vm.name = Java HotSpot(TM) Server VM
java.vm.specification.name = Java Virtual Machine Specification
java.vm.specification.vendor = Sun Microsystems Inc.
java.vm.specification.version = 1.0
java.vm.vendor = Sun Microsystems Inc.
java.vm.version = 16.3-b01
os.arch = sparc
os.name = SunOS
os.version = 5.10

** BEA JRockit 1.6.0_14 R27.6.5 on Windows XP SP3 **
java.runtime.name = Java(TM) SE Runtime Environment
java.runtime.version = 1.6.0_14-b08
java.specification.name = Java Platform API Specification
java.specification.vendor = Sun Microsystems Inc.
java.specification.version = 1.6
java.vendor = BEA Systems, Inc.
java.vendor.url = http://www.bea.com/
java.vendor.url.bug = http://edocs.bea.com/jrockit/go2troubleshooting.html
java.version = 1.6.0_14
java.vm.info = compiled mode
java.vm.name = BEA JRockit(R)
java.vm.specification.name = Java Virtual Machine Specification
java.vm.specification.vendor = Sun Microsystems Inc.
java.vm.specification.version = 1.0
java.vm.vendor = BEA Systems, Inc.
java.vm.vendor.url = http://www.bea.com/
java.vm.vendor.url.bug = http://edocs.bea.com/jrockit/go2troubleshooting.html
java.vm.version = R27.6.5-32_o-121899-1.6.0_14-20091001-2107-windows- ia32
os.arch = x86
os.name = Windows XP
os.version = 5.1

** Oracle JRockit 1.6.0_20 R28.0.1 on Windows XP SP3 **
java.runtime.name = Java(TM) SE Runtime Environment
java.runtime.version = 1.6.0_20-b02
java.specification.name = Java Platform API Specification
java.specification.vendor = Sun Microsystems Inc.
java.specification.version = 1.6
java.vendor = Oracle Corporation
java.vendor.url = http://www.oracle.com/
java.vendor.url.bug =
http://download.oracle.com/docs/cd/E15289_01/go2troubleshooting.html
java.version = 1.6.0_20
java.vm.info = compiled mode
java.vm.name = Oracle JRockit(R)
java.vm.specification.name = Java Virtual Machine Specification
java.vm.specification.vendor = Sun Microsystems Inc.
java.vm.specification.version = 1.0
java.vm.vendor = Oracle Corporation
java.vm.vendor.url = http://www.oracle.com/
java.vm.vendor.url.bug =
http://download.oracle.com/docs/cd/E15289_01/go2troubleshooting.html
java.vm.version = R28.0.1-21-133393-1.6.0_20-20100512-2132-windows- ia32
os.arch = x86
os.name = Windows XP
os.version = 5.1

** IBM J9 1.6.0 SR7 on AIX 6.1 **
java.runtime.name = Java(TM) SE Runtime Environment
java.runtime.version = pap6460sr7-20091215_02 (SR7)
java.specification.name = Java Platform API Specification
java.specification.vendor = Sun Microsystems Inc.
java.specification.version = 1.6
java.vendor = IBM Corporation
java.vendor.url = http://www.ibm.com/
java.version = 1.6.0
java.vm.info = JRE 1.6.0 IBM J9 2.4 AIX ppc64-64
jvmap6460sr7-20091214_49398 (JIT enabled, AOT enabled)\
    J9VM - 20091214_049398\
    JIT  - r9_20091123_13891\
    GC   - 20091111_AA
java.vm.name = IBM J9 VM
java.vm.specification.name = Java Virtual Machine Specification
java.vm.specification.vendor = Sun Microsystems Inc.
java.vm.specification.version = 1.0
java.vm.vendor = IBM Corporation
java.vm.version = 2.4
os.arch = ppc64
os.name = AIX
os.version = 6.1

Reply via email to