I have attached a short patch for a first shot at implementing such a class, with the changes to the launcher also. With this patch you can type -version to get normal version string information (from Java properties, so may not get the full version info from drlvm yet) and -version:extended to get the full manifest version information also. Perhaps it could be formatted better, but it's a starting place ;) If this seems along the right lines, Ill commit it after M9 and we can tweak it as we see fit.

Regards,
Oliver


Regis wrote:
Deven You wrote:
2009/3/19 Oliver Deakin <[email protected]>

That sounds similar to the solution I was thinking of as well - we could create an internal Harmony class that looks up properties/version values and constructs an output version information string from them. This class would be invoked by the launcher if the -version option is found anywhere in the
command line options.


I see that J9 puts it's full version information in the java.fullversion and java.vm.info properties, but these are non-standard. I cannot see the version info that drlvm prints when passed -version in any Java property. The standard Java properties only provide high level version information
(not full component breakdown, build dates, repository revision etc.).
Perhaps drlvm could also set the java.fullversion (or some other) property - then the class that puts together the version information could look at this property first and if it exists use it, otherwise fall back to the standard,
less detailed, properties (java.vm.version, java.vm.name etc.).

For the class libraries, I agree that a per module version info might be
quite useful - I guess we would want to output the Bundle-Name and
Bundle-Version from each jar manifest?

Regards,
Oliver

I agree this opinion and I suggest may we use another option like
-classlibversion to show the classlib version information.

It's a good idea, -version should show brief information about classlib, like svn revision, build time, -classlibversion show all detail informations of each modules. It could be a Harmony extension :)


Tim Ellison wrote:

Deven You wrote:


Harmony java launcher "java -version" command can not work with IBM J9
VM26 . The error result is as below:

 ../jres/see/bin/java -version
Apache Harmony Launcher : (c) Copyright 1991, 2008 The Apache Software
Foundation or its licensors, as applicable.
JVMJ9VM007E Command-line option unrecognised: -version
HMYEXEL062E Internal VM error: Failed to create Java VM
FAILED to invoke JVM
This issue occurs on both linux and windows x86 platform.

 I find our laucher just invoke the mothod JNI_CreateJavaVM()  of  vm
which
on j9 vm does not deal with -version option according to JNI
Specification.
the specification says:
"All Java virtual machine implementations must recognize the following
set
of standard options:  ..."
it lists:
 -D<name><value>
 -verbose
 vfprintf
 exit
 abort

It then goes on to stay:
"In addition, virtual machine implementations may support their own set
of
implementation-dependent option strings. Implementation-dependent option
strings must begin with "-X" or an underscore."
Any other option is non-standard.

but for DRLVM, seems its JNI_CreateJavaVM() does not comply with JNI
Specification and support -version option.the result is below:

Apache Harmony Launcher : (c) Copyright 1991, 2008 The Apache Software
Foundation or its licensors, as applicable.
java version "1.5.0"
pre-alpha : not complete or compatible
svn = r745401, (Feb 18 2009), Windows/ia32/msvc 1310, release build
http://harmony.apache.org.
but there is still no vm version info.

I suggest our java launcher should not pass -version or other
non-standarad
options  to vm interface JNI_CreateJavaVM(), instead we should make a
general solution to deal with them, maybe call certain methods in jre
tool
package. so that  our java laucher can work well on different vms.


Sounds reasonable to me.

A basic implementation would create the VM then query the values in
java.vm.version etc and print those, a more sophisticated (and longer
running<g>) implementation would run a Java class and pull out the VM
version plus version information from our class library JARs too.

(We would need to define the SVN build info as a property too so it can
be picked up from Java)

Regards,
Tim



--
Oliver Deakin
Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number 741598. Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire
PO6 3AU






--
Oliver Deakin
Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number 741598. Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU

Index: src/main/java/org/apache/harmony/luni/util/Version.java
===================================================================
--- src/main/java/org/apache/harmony/luni/util/Version.java     (revision 0)
+++ src/main/java/org/apache/harmony/luni/util/Version.java     (revision 0)
@@ -0,0 +1,86 @@
+package org.apache.harmony.luni.util;
+
+import java.util.StringTokenizer;
+import java.util.Iterator;
+import java.util.jar.*;
+import java.io.IOException;
+
+class Version {
+    /*
+     * Display VM version information
+     */
+    private static void displayVMVersion() {
+        String version = System.getProperty("java.version");
+        if (version != null) System.out.println("java version \"" + version + 
"\"");
+
+        String name = System.getProperty("java.runtime.name");
+        version = System.getProperty("java.runtime.version");
+
+        if (name != null) {
+            if (version != null) name = name + " (" + version + ")";
+            System.out.println(name);
+        }
+
+        name = System.getProperty("java.vm.name");
+        version = System.getProperty("java.vm.version");
+        if (name != null) {
+            if (version != null) name = name + " (" + version + ")";
+            System.out.println(name);
+        }
+
+        name = System.getProperty("java.fullversion");
+        if (name != null) System.out.println(name);
+    }
+
+    /*
+     * Display class library version information
+     */
+    private static void displayClasslibVersion() {
+        // Get the bootclasspath and tokenise for each jar file
+        String bootclasspath = 
System.getProperty("org.apache.harmony.boot.class.path");
+        if (bootclasspath == null) return;
+
+        StringTokenizer tokenizer = new StringTokenizer(bootclasspath, 
System.getProperty("path.separator"));
+
+        while (tokenizer.hasMoreTokens()) {
+            String jarPath = tokenizer.nextToken();
+
+            // If the current path is not a jar file, then continue iteration 
through tokens
+            if (!jarPath.endsWith(".jar")) continue;
+
+            // Get the jar manifest and find it's name and version info
+            JarFile jarFile;
+            Manifest manifest;
+            try {
+                jarFile = new JarFile(jarPath);
+                manifest = jarFile.getManifest();
+            } catch (IOException e) {
+                // We have hit an exception - just carry onto the next jar file
+                continue;
+            }
+
+            // Get the manifest attributes and output those we are interested 
in
+            Attributes attributes = manifest.getMainAttributes();
+            if (attributes == null) continue;
+
+            String bundleName = attributes.getValue("Bundle-Name");
+            if (bundleName == null) continue;
+            String bundleVersion = attributes.getValue("Bundle-Version");
+            if (bundleVersion == null) continue;
+
+            System.out.println(jarPath + " " + bundleName + " " + 
bundleVersion);
+        }
+
+    }
+
+    public static void version(String versionOpt) {
+        if (versionOpt.equals("-version")) {
+            displayVMVersion();
+        } else if (versionOpt.equals("-version:extended")) {
+            displayVMVersion();
+            displayClasslibVersion();
+        } else {
+            System.out.println("Option " + versionOpt + " unrecognised - 
please use -version or -version:extended");
+        }
+    }
+}

Property changes on: src\main\java\org\apache\harmony\luni\util\Version.java
___________________________________________________________________
Name: svn:eol-style
   + native

Index: src/main/native/launcher/shared/main.c
===================================================================
--- src/main/native/launcher/shared/main.c      (revision 749575)
+++ src/main/native/launcher/shared/main.c      (working copy)
@@ -58,7 +58,7 @@
 PROTOTYPE ((HyPortLibrary * portLibrary, int argc, char **argv, UDATA handle,
             jint version, jboolean ignoreUnrecognized, char *mainClass,
             UDATA classArg, char *propertiesFileName,
-            int isStandaloneJar, char *vmdllsubdir));
+            int isStandaloneJar, char *vmdllsubdir, int versionFlag));
 static int createVMArgs
 PROTOTYPE ((HyPortLibrary * portLibrary, int argc, char **argv,
             jint version, jboolean ignoreUnrecognized,
@@ -227,8 +227,9 @@
                        /* The arg is a JAR file to run */
                        isStandaloneJar = 1;
                }
-               if (0 == strcmp ("-version", argv[i])) {
-            versionFlag = 1;
+               if (0 == strncmp ("-version", argv[i], 8)) {
+            /* Display version information */
+            versionFlag = i;
                }
                if (0 == strcmp ("-showversion", argv[i])) {
                        /* We are being asked to print our version and continue 
*/
@@ -363,12 +364,6 @@
         }
     }
     
-  if (versionFlag == 1) {
-    /* 
-     * We are being asked to print our version, and quit 
-     */
-    hyfile_printf (PORTLIB, HYPORT_TTY_OUT, HY_COPYRIGHT_STRING "\n");    
-  }
   /* set up the properties file */
   propertiesFileName = hymem_allocate_memory (strlen (vmiPath) + 12);
   if (propertiesFileName == NULL)
@@ -392,7 +387,7 @@
   /* main launcher processing in this function */
   rc = invocation
       (PORTLIB, argc, argv, handle, JNI_VERSION_1_4, JNI_TRUE, mainClass,
-       classArg, propertiesFileName, isStandaloneJar, vmdllsubdir);
+       classArg, propertiesFileName, isStandaloneJar, vmdllsubdir, 
versionFlag);
   if (rc)
     {
          /* Print an error message except in the case where an uncaught 
Exception 
@@ -642,7 +637,7 @@
 invocation (HyPortLibrary * portLibrary, int argc, char **argv, UDATA handle,
             jint version, jboolean ignoreUnrecognized, char *mainClass,
             UDATA classArg, char *propertiesFileName,
-            int isStandaloneJar, char *vmdllsubdir)
+            int isStandaloneJar, char *vmdllsubdir, int versionFlag)
 {
   JavaVMInitArgs vm_args;
   JavaVM *jvm;
@@ -678,6 +673,27 @@
     }
 
   rc = 0;
+
+  if (versionFlag) {
+      jclass clazz;
+      jmethodID mID;
+      jstring jStrObject;
+        
+      jStrObject = (*env)->NewStringUTF (env, argv[versionFlag]);
+      if (!jStrObject) return 3;
+        
+      clazz = (*env)->FindClass (env, "org/apache/harmony/luni/util/Version");
+      if (!clazz) return 3;
+        
+      mID = (*env)->GetStaticMethodID (env, clazz, "version",
+                         "(Ljava/lang/String;)V");
+      if (!mID) return 3;
+        
+      (*env)->CallStaticVoidMethod(env, clazz, mID, jStrObject);
+        
+      return 0;
+  }
+
   if (mainClass)
     {
       if (isStandaloneJar)
@@ -952,7 +968,8 @@
    {
        if ( (strcmp (argv[i], "-jar") != 0) 
            && (strncmp (argv[i], "-vmdir:", 7) != 0)
-           && (strncmp (argv[i], "-vm:", 4) != 0) )
+           && (strncmp (argv[i], "-vm:", 4) != 0) 
+           && (strncmp (argv[i], "-version", 8) != 0))
        {
           /* special coding for -classpath and -cp */
           /* they get passed to the vm as -Djava.class.path */

Reply via email to