Uploaded image for project: 'Yoko - CORBA Server'
  1. Yoko - CORBA Server
  2. YOKO-360

java.lang.Error: cannot find computeSerialVersionUID method when running Caucho Resin AppServer on Harmony

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • Incubation
    • v1.0.0
    • RMI-IIOP
    • Security Level: public (Regular issues)
    • None
    • Patch Available

    Description

      java.lang.Error: cannot find computeSerialVersionUID method
      at org.apache.yoko.rmi.impl.ValueDescriptor$1.run(ValueDescriptor.java:158)
      at java.security.AccessController.doPrivilegedImpl(AccessController.java:171)
      at java.security.AccessController.doPrivileged(AccessController.java:53)
      at org.apache.yoko.rmi.impl.ValueDescriptor.getSerialVersionUID(ValueDescriptor.java:138)
      at org.apache.yoko.rmi.impl.ValueDescriptor.getRepositoryID(ValueDescriptor.java:109)
      at org.apache.yoko.rmi.impl.TypeRepository.init(TypeRepository.java:81)
      at org.apache.yoko.rmi.impl.TypeRepository.<init>(TypeRepository.java:45)
      at org.apache.yoko.rmi.impl.RMIState.getTypeRepository(RMIState.java:63)
      at org.apache.yoko.rmi.impl.RMIState.createValueHandler(RMIState.java:146)
      at org.apache.yoko.rmi.impl.UtilImpl.createValueHandler(UtilImpl.java:450)
      at javax.rmi.CORBA.Util.createValueHandler(Util.java:61)
      at com.caucho.iiop.any.TypeCodeFactory.<clinit>(TypeCodeFactory.java:40)
      at com.caucho.iiop.orb.ORBImpl.<init>(ORBImpl.java:57)
      at com.caucho.loader.EnvironmentClassLoader.initializeEnvironment(EnvironmentClassLoader.java:567)
      at com.caucho.loader.EnvironmentClassLoader.init(EnvironmentClassLoader.java:161)
      at com.caucho.loader.ClassLoaderConfig.init(ClassLoaderConfig.java:164)
      at java.lang.reflect.VMReflection.invokeMethod(VMReflection.java)
      at java.lang.reflect.Method.invoke(Method.java:381)
      at com.caucho.config.j2ee.PostConstructProgram.configureImpl(PostConstructProgram.java:62)
      at com.caucho.config.BeanTypeStrategy.init(BeanTypeStrategy.java:355)
      at com.caucho.config.NodeBuilder.configureImpl(NodeBuilder.java:253)
      at com.caucho.config.EnvironmentAttributeStrategy.configure(EnvironmentAttributeStrategy.java:60)
      at com.caucho.config.NodeBuilder.configureAttributeImpl(NodeBuilder.java:390)
      at com.caucho.config.NodeBuilder.configureBeanImpl(NodeBuilder.java:329)
      at com.caucho.config.TypeStrategy.configureBean(TypeStrategy.java:104)
      at com.caucho.config.BeanTypeStrategy.configureBean(BeanTypeStrategy.java:257)
      at com.caucho.config.EnvironmentTypeStrategy.configureBean(EnvironmentTypeStrategy.java:65)
      at com.caucho.config.NodeBuilder.configureImpl(NodeBuilder.java:251)
      at com.caucho.config.NodeBuilder.configure(NodeBuilder.java:160)
      at com.caucho.config.Config.configure(Config.java:232)
      at com.caucho.config.Config.configure(Config.java:176)
      at com.caucho.boot.ResinBoot.<init>(ResinBoot.java:134)
      at com.caucho.boot.ResinBoot.main(ResinBoot.java:397)
      at java.lang.reflect.VMReflection.invokeMethod(VMReflection.java)
      at java.lang.reflect.Method.invoke(Method.java:381)
      at org.apache.harmony.vm.JarRunner.main(JarRunner.java:80)
      Caused by: java.lang.NoSuchMethodException: computeDefaultSUID(java.lang.Class)
      at java.lang.Class.findMatchingMethod(Class.java:802)
      at java.lang.Class.getDeclaredMethod(Class.java:429)
      at org.apache.yoko.rmi.impl.ValueDescriptor$1.run(ValueDescriptor.java:149)
      at java.security.AccessController.doPrivilegedImpl(AccessController.java:171)

      This failure occurs as Yoko depends on private java.lang.Class.computeSerialVersionUID method which is of course not present in Harmony.

      The org.apache.yoko.rmi.impl.ValueDescriptor.getSerialVersionUID code looks very strange as some sort of hacky performance optimization. I've made simple patch which fixes the problem by removing all the suspicious code.

      Index: rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
      ===================================================================
      — rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java (revision 532714)
      +++ rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java (working copy)
      @@ -122,8 +122,6 @@
      return _repid;
      }

      • static java.lang.reflect.Method computeSerialVersionUID_method = null;
        -
        long getSerialVersionUID()
        Unknown macro: { if (_serial_version_uid_field != null) { @@ -134,55 +132,10 @@ } }
      • if (computeSerialVersionUID_method == null) {
      • java.security.AccessController
      • .doPrivileged(new java.security.PrivilegedAction() {
      • public Object run() {
        + java.io.ObjectStreamClass serialForm = java.io.ObjectStreamClass.lookup(getJavaClass());
        +
        + return serialForm != null ? serialForm.getSerialVersionUID() : 0L;
      • try {
      • try {
      • computeSerialVersionUID_method = java.io.ObjectStreamClass.class
      • .getDeclaredMethod(
      • "computeSerialVersionUID",
      • new Class[] { Class.class });
        - } catch (Exception ex) {
        - computeSerialVersionUID_method = java.io.ObjectStreamClass.class
        - .getDeclaredMethod(
        - "computeDefaultSUID",
        - new Class[] { Class.class }

        );

      • }
      • computeSerialVersionUID_method
      • .setAccessible(true);
        -
      • } catch (Exception ex) { - throw new Error( - "cannot find computeSerialVersionUID method", - ex); - }

        -

      • return null;
      • }
      • });
      • }
        -
      • try {
      • if (computeSerialVersionUID_method != null) {
      • Long result = (Long) computeSerialVersionUID_method.invoke(
      • null, new Object[] { getJavaClass() }

        );
        -

      • return result.longValue();
      • }
        -
      • return java.io.ObjectStreamClass.lookup(getJavaClass())
      • .getSerialVersionUID();
        -
      • } catch (Throwable ex) { - logger.finer("Cannot compute serial version UID. " - + "This may be because you're running " - + "the Apache Yoko RMI on a JVM which is not compatible. " - + ex); - return 0; - }

        }

      public void init() {

      Attachments

        1. yoko-360.patch
          2 kB
          Sergey Salishev

        Issue Links

          Activity

            People

              Unassigned Unassigned
              iceslice Sergey Salishev
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: