You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@aries.apache.org by "Björn Kautler (JIRA)" <ji...@apache.org> on 2018/05/18 11:46:00 UTC

[jira] [Created] (ARIES-1801) SPI Fly does not work with a dynamic class object

Björn Kautler created ARIES-1801:
------------------------------------

             Summary: SPI Fly does not work with a dynamic class object
                 Key: ARIES-1801
                 URL: https://issues.apache.org/jira/browse/ARIES-1801
             Project: Aries
          Issue Type: Bug
    Affects Versions: 1.0
            Reporter: Björn Kautler


SLF4J changes in version 1.8 how implementations are looked up to {{java.util.ServiceLoader}}.

In our codebase we dynamically search for an SLF4J implementation and use a default logger if none is found.

To adapt to the new mechanism but remain compatible with SLF4J 1.7 I added to our codebase
{code:java}
try {
    // post-1.8 mechanism
    Class<?> slf4jServiceProviderClass = Class.forName("org.slf4j.spi.SLF4JServiceProvider");
    if (ServiceLoader.load(slf4jServiceProviderClass).iterator().hasNext()) {
        noLogger.set(false);
        return true;
    }
} catch (ClassNotFoundException e) {
    // ignore
}
{code}
If I now use the {{org.apache.aries.spifly.dynamic.bundle}} 1.0.10, I get an exception as SPI Fly seemingly only supports class constants. While traversing the ASM tree it remembers the last class constant seen and uses that to transform the {{load}} call.

Here the exception I get:
{code:java}
java.lang.ClassFormatError: Weaving hook failed.
	at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.transformClass(BundleWiringImpl.java:2479)
	at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2152)
	at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1607)
	at org.apache.felix.framework.BundleWiringImpl.access$200(BundleWiringImpl.java:80)
	at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2053)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at org.javacord.core.util.logging.ExceptionLoggerDelegateImpl.<clinit>(ExceptionLoggerDelegateImpl.java:20)
	at org.javacord.core.util.DelegateFactoryDelegateImpl.createExceptionLoggerDelegate(DelegateFactoryDelegateImpl.java:180)
	at org.javacord.api.util.internal.DelegateFactory.<clinit>(DelegateFactory.java:74)
	at org.javacord.api.DiscordApiBuilder.<init>(DiscordApiBuilder.java:20)
	at net.kautler.test.osgi.OsgiTest.start(OsgiTest.java:17)
	at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:697)
	at org.apache.felix.framework.Felix.activateBundle(Felix.java:2240)
	at org.apache.felix.framework.Felix.startBundle(Felix.java:2146)
	at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1373)
	at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: value null
	at org.objectweb.asm.ClassWriter.newConstItem(ClassWriter.java:1057)
	at org.objectweb.asm.MethodWriter.visitLdcInsn(MethodWriter.java:1126)
	at org.apache.aries.spifly.weaver.TCCLSetterVisitor$TCCLSetterMethodVisitor.visitMethodInsn(TCCLSetterVisitor.java:194)
	at org.objectweb.asm.ClassReader.readCode(ClassReader.java:1416)
	at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1017)
	at org.objectweb.asm.ClassReader.accept(ClassReader.java:693)
	at org.objectweb.asm.ClassReader.accept(ClassReader.java:506)
	at org.apache.aries.spifly.dynamic.ClientWeavingHook.weave(ClientWeavingHook.java:61)
	at org.apache.felix.framework.util.SecureAction.invokeWeavingHook(SecureAction.java:1203)
	at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.transformClass(BundleWiringImpl.java:2465)
	... 16 more
{code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)