java.lang.Error: cannot find computeSerialVersionUID method when running Caucho Resin AppServer on Harmony ----------------------------------------------------------------------------------------------------------
Key: YOKO-360 URL: https://issues.apache.org/jira/browse/YOKO-360 Project: Yoko - CORBA Server Issue Type: Bug Components: RMI-IIOP Affects Versions: Incubation Reporter: Sergey Salishev 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() { 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() { -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.