Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Loading extensions crashes kotlin application #492

Closed
makiam opened this issue Mar 19, 2022 · 5 comments
Closed

Loading extensions crashes kotlin application #492

makiam opened this issue Mar 19, 2022 · 5 comments

Comments

@makiam
Copy link

makiam commented Mar 19, 2022

I try to create Kotlin application with pf4j support and found this issue... (This is very similar to issue #297)
Using pf4j 3.6.0
I try to enable support for system extensions and declare extension to DefaultPluginManager

        val manager: PluginManager = object: DefaultPluginManager() {
            override fun createExtensionFinder(): ExtensionFinder {
                val extensionFinder = super.createExtensionFinder() as DefaultExtensionFinder
                extensionFinder.addServiceProviderExtensionFinder() // to activate "HowdyGreeting" extension
                return extensionFinder
            }
        }

than once I start application and try to find my extension

    init {
        val tools: List<Tool> = ArtOfIllusion.manager.getExtensions(Tool::class.java);
        tools.forEach(System.out::println)
    }

I see this output with exception:
23:24:12.307 [main] INFO org.pf4j.DefaultPluginStatusProvider - Enabled plugins: []
23:24:12.307 [main] INFO org.pf4j.DefaultPluginStatusProvider - Disabled plugins: []
23:24:12.307 [main] INFO org.pf4j.DefaultPluginManager - PF4J version 3.6.0 in 'deployment' mode
23:24:12.408 [main] DEBUG org.pf4j.AbstractPluginManager - Lookup plugins in '[plugins]'
23:24:12.408 [main] WARN org.pf4j.AbstractPluginManager - No 'plugins' root
23:24:12.408 [main] INFO org.pf4j.AbstractPluginManager - No plugins
23:24:12.947 [AWT-EventQueue-0] DEBUG org.pf4j.AbstractExtensionFinder - Finding extensions of extension point 'api.Tool'
23:24:12.947 [AWT-EventQueue-0] DEBUG org.pf4j.LegacyExtensionFinder - Reading extensions storages from classpath
23:24:12.947 [AWT-EventQueue-0] DEBUG org.pf4j.LegacyExtensionFinder - Cannot find 'META-INF/extensions.idx'
23:24:12.947 [AWT-EventQueue-0] DEBUG org.pf4j.AbstractExtensionFinder - No extensions found
23:24:12.947 [AWT-EventQueue-0] DEBUG org.pf4j.LegacyExtensionFinder - Reading extensions storages from plugins
23:24:12.947 [AWT-EventQueue-0] DEBUG org.pf4j.AbstractExtensionFinder - Finding extensions of extension point 'api.Tool' for plugin 'null'
23:24:12.947 [AWT-EventQueue-0] DEBUG org.pf4j.AbstractExtensionFinder - No extensions found for extension point 'api.Tool'
23:24:12.947 [AWT-EventQueue-0] DEBUG org.pf4j.AbstractExtensionFinder - Finding extensions of extension point 'api.Tool'
23:24:12.947 [AWT-EventQueue-0] DEBUG org.pf4j.ServiceProviderExtensionFinder - Reading extensions storages from classpath
23:24:12.947 [AWT-EventQueue-0] DEBUG org.pf4j.ServiceProviderExtensionFinder - Read 'file:/C:/Users/MaksK/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.11/4741689214e9d1e8408b206506cbe76d1c6a7d60/logback-classic-1.2.11.jar!/META-INF/services'
23:24:12.978 [AWT-EventQueue-0] DEBUG org.pf4j.ServiceProviderExtensionFinder - Read 'META-INF/services/javax.servlet.ServletContainerInitializer'
23:24:12.978 [AWT-EventQueue-0] DEBUG org.pf4j.ServiceProviderExtensionFinder - Read 'file:/C:/Users/MaksK/.gradle/caches/modules-2/files-2.1/org.pf4j/pf4j/3.6.0/9025adf3f680069bb1b52863c9ec70d341e09b0/pf4j-3.6.0.jar!/META-INF/services/'
23:24:12.978 [AWT-EventQueue-0] DEBUG org.pf4j.ServiceProviderExtensionFinder - Read 'META-INF/services/javax.annotation.processing.Processor'
23:24:12.978 [AWT-EventQueue-0] DEBUG org.pf4j.AbstractExtensionFinder - Found possible 2 extensions:
23:24:12.978 [AWT-EventQueue-0] DEBUG org.pf4j.AbstractExtensionFinder - ch.qos.logback.classic.servlet.LogbackServletContainerInitializer
23:24:12.978 [AWT-EventQueue-0] DEBUG org.pf4j.AbstractExtensionFinder - org.pf4j.processor.ExtensionAnnotationProcessor
23:24:12.978 [AWT-EventQueue-0] DEBUG org.pf4j.ServiceProviderExtensionFinder - Reading extensions storages from plugins
23:24:12.978 [AWT-EventQueue-0] DEBUG org.pf4j.AbstractExtensionFinder - Finding extensions of extension point 'api.Tool' for plugin 'null'
23:24:12.978 [AWT-EventQueue-0] DEBUG org.pf4j.AbstractExtensionFinder - Loading class 'ch.qos.logback.classic.servlet.LogbackServletContainerInitializer' using class loader 'jdk.internal.loader.ClassLoaders$AppClassLoader@5a07e868'
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/servlet/ServletContainerInitializer
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at org.pf4j.AbstractExtensionFinder.find(AbstractExtensionFinder.java:141)
at org.pf4j.AbstractExtensionFinder.find(AbstractExtensionFinder.java:62)
at org.pf4j.DefaultExtensionFinder.find(DefaultExtensionFinder.java:45)
at org.pf4j.AbstractPluginManager.getExtensions(AbstractPluginManager.java:580)
at artofillusion.ToolsMenu.(ToolsMenu.kt:9)
at artofillusion.LayoutWindow.frameInit(LayoutWindow.kt:26)
at java.desktop/javax.swing.JFrame.(JFrame.java:181)
at artofillusion.LayoutWindow.(LayoutWindow.kt:7)
at artofillusion.ArtOfIllusion.init$lambda-0(ArtOfIllusion.kt:14)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContainerInitializer
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 31 more

Process finished with exit code 0

@decebals
Copy link
Member

I think that it's not a problem related Kotlin, it's a missing dependency. Please try to create a Java (preferably vanilla Java) quickstart that replicates your problem.

@makiam
Copy link
Author

makiam commented Apr 25, 2022

I found that this issue is definitely not related to Kotlin. I reproduce this issue with vanilla Java code as well. However I think this still may be an issue inside AbstractExtensionFinder code. As I see fix in #297 commit You added extra catch for NoClassDefFoundError for List find(String pluginId) method but in my code I exception thrown from List<ExtensionWrapper> find(Class type, String pluginId) method

@decebals
Copy link
Member

@makiam can you share the unit test or the quickstart project that you created to reproduce the issue using vanilla Java code?

@makiam
Copy link
Author

makiam commented Jun 29, 2022

JGLApp.zip

@decebals
Copy link
Member

decebals commented Jun 29, 2022

So, in your case is not necessary to create an instance of DefaultPluginManager with enabled support for ServiceProviderExtensionFinder (this is necessary when your application contains extensions declared via Java Service Provider mechanism - using META-INF/services)
With this occasion I fixed a bug related to ServiceProviderExtensionFinder. Things on this topic are not very clear because the application can contains multiple dependencies and each dependency could have a META-INF/services. In this case all these services are detected by PF4J as extensions. It's not completely wrong but in same cases I don't want this behavior (I want somehow only my extensions declared via Java Service Provider mechanism).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants