1 2 Previous Next 16 Replies Latest reply on Nov 28, 2009 8:25 PM by Seto Kaiba

    Scala is NOT mature enough for Weld

    Francisco Jose Peredo Noguez Master

      Scala is not mature enough for Weld (or any other reflection related operation). Turns out that one of the feature that make scala so interesting (closures) is also a source of incompatibility (the internal anonymous class files that generate are invalid)


      So, if for example, I have a code like this (inside any method in a class):


      val classNames = Conversions.convertList(names).reduceLeft[String] { (acc, n) =>
              acc + ", " + n
      }
      



      That generates an inner class that makes Java reflection unusable:


      java.lang.IncompatibleClassChangeError: com.googlecode.solder.dwr.WeldContainer and com.googlecode.solder.dwr.WeldContainer$$anonfun$getClasses$1 disagree on InnerClasses attribute
           at java.lang.Class.getDeclaringClass(Native Method)
           at java.lang.Class.getEnclosingClass(Class.java:1085)
           at java.lang.Class.getSimpleBinaryName(Class.java:1220)
           at java.lang.Class.getSimpleName(Class.java:1112)
           at org.jboss.weld.util.Names.typeToString(Names.java:251)
           at org.jboss.weld.util.Names.classToString(Names.java:263)
           at org.jboss.weld.introspector.jlr.WeldClassImpl.<init>(WeldClassImpl.java:151)
           at org.jboss.weld.introspector.jlr.WeldClassImpl.of(WeldClassImpl.java:133)
           at org.jboss.weld.resources.ClassTransformer$2.call(ClassTransformer.java:72)
           at org.jboss.weld.resources.ClassTransformer$2.call(ClassTransformer.java:68)
           at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
           at java.util.concurrent.FutureTask.run(FutureTask.java:138)
           at org.jboss.weld.util.collections.ConcurrentCache.putIfAbsent(ConcurrentCache.java:125)
           at org.jboss.weld.resources.ClassTransformer.loadClass(ClassTransformer.java:67)
           at org.jboss.weld.bootstrap.BeanDeployer.addClass(BeanDeployer.java:59)
           at org.jboss.weld.bootstrap.BeanDeployer.addClasses(BeanDeployer.java:86)
           at org.jboss.weld.bootstrap.BeanDeployment.deployBeans(BeanDeployment.java:134)
           at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:367)
           at org.jboss.weld.environment.servlet.Listener.contextInitialized(Listener.java:158)
           at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
           at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
           at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
           at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
           at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
           at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
           at org.apache.catalina.core.StandardService.start(StandardService.java:516)
           at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
           at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
           at java.lang.reflect.Method.invoke(Method.java:597)
           at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
           at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
      



      Apparently this is a known problem since 2008-08-03 (16 months so far) and AFAIK they are not in a hurry to fix it.


      I guess that means I am going to have to start removing Scala from my Weld project. I am sad about this because Scala is IMO a really beautiful language, that feels much cleaner than Java, but if the .class files that it generates are not compatible with the rest of Java... it is just useless for me.


      One more thing... this is clearly a Scala bug, but... Is there any chance a workaround for this could be created in Weld? (Perhaps a way to tell Weld to ignore InnerClasses? or to just skip the corrupt ones? )

        1 2 Previous Next