[ https://issues.apache.org/jira/browse/YOKO-360?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Rick McGuire closed YOKO-360. ----------------------------- Resolution: Fixed Fix Version/s: v1.0.0 Committed revision 533053. Thank you for the patch Sergey. I love a solution that's simpler and easier to understand than the original. > 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 > Fix For: v1.0.0 > > > 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.