Uploaded image for project: 'Felix'
  1. Felix
  2. FELIX-2492

scr plugin: using src annotations causes NoClassDefFoundError and other errors

    XMLWordPrintableJSON

Details

    Description

      Using comment tags and having a dependency on slf4j-api causes the scr plugin to throw a NoClassDefFoundError:

      java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
      at org.slf4j.LoggerFactory.<clinit>(LoggerFactory.java:60)
      at com.day.crx.spi.sharepoint.resource.SharepointResourceProvider.<clinit>(SharepointResourceProvider.java:60)
      at sun.misc.Unsafe.ensureClassInitialized(Native Method)
      at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:25)
      at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:122)
      at java.lang.reflect.Field.acquireFieldAccessor(Field.java:918)
      at java.lang.reflect.Field.getFieldAccessor(Field.java:899)
      at java.lang.reflect.Field.get(Field.java:358)
      at org.apache.felix.scrplugin.tags.ClassUtil.getInitializationExpression(ClassUtil.java:41)
      at org.apache.felix.scrplugin.tags.qdox.QDoxJavaField.getInitializationExpression(QDoxJavaField.java:44)
      at org.apache.felix.scrplugin.helper.PropertyHandler.getPropertyName(PropertyHandler.java:239)

      A workaround is to add a 'dummy' dependency to i.e. slf4j-simple. But then

      [WARNING] Unused declared dependencies found:
      [WARNING] org.slf4j:slf4j-simple:jar:1.5.0:provided

      Furthermore when the 'dummy' dependency has the wrong version, the scr plugin might throw other errors:

      java.lang.NoSuchFieldError: name
      at org.slf4j.impl.Log4jLoggerAdapter.<init>(Log4jLoggerAdapter.java:75)
      at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:75)
      at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:103)
      at com.day.crx.spi.sharepoint.resource.SharepointResourceProvider.<clinit>(SharepointResourceProvider.java:60)
      at sun.misc.Unsafe.ensureClassInitialized(Native Method)
      at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:25)
      at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:122)
      at java.lang.reflect.Field.acquireFieldAccessor(Field.java:918)
      at java.lang.reflect.Field.getFieldAccessor(Field.java:899)
      at java.lang.reflect.Field.get(Field.java:358)
      at org.apache.felix.scrplugin.tags.ClassUtil.getInitializationExpression(ClassUtil.java:41)
      at org.apache.felix.scrplugin.tags.qdox.QDoxJavaField.getInitializationExpression(QDoxJavaField.java:44)
      at org.apache.felix.scrplugin.helper.PropertyHandler.getPropertyName(PropertyHandler.java:238)

      I think such errors should be handled more gracefully indicating the source of the problem. Also it should not be necessary to have a 'dummy' dependencies. This was not the case up to version 1.4.1.
      If it is absolutely necessary to include such dummy dependencies, the plugin should state so in its error message. Also the slf4j case is so common that it might be worth to considering a specific solution/workaround for this in the plugin. This is still much better than forcing all clients to analyze the problem from the stacktrace and then implement workarounds.

      Attachments

        Issue Links

          Activity

            People

              cziegeler Carsten Ziegeler
              mduerig Michael Dürig
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: