Jens Deppe created GEODE-800:
--------------------------------

             Summary: Geode's classloading mechanism is unable to resolve 
classes found within nested jars
                 Key: GEODE-800
                 URL: https://issues.apache.org/jira/browse/GEODE-800
             Project: Geode
          Issue Type: Bug
          Components: management
            Reporter: Jens Deppe


This issue is particularly evident when using Geode in a Spring Boot app which 
creates an 'über' jar containing all dependent jars.

When Geode is launched in this context, the following errors can be seen:
{noformat}
[warn 2016/01/20 08:53:29.431 PST <main> tid=0xd] (tid=13 msgId=0) Required 
Commands classes were not loaded. Check logs for errors.
java.lang.IllegalStateException: Required Commands classes were not loaded. 
Check logs for errors.
        at 
com.gemstone.gemfire.management.internal.cli.CommandManager.raiseExceptionIfEmpty(CommandManager.java:249)
        at 
com.gemstone.gemfire.management.internal.cli.CommandManager.loadCommands(CommandManager.java:188)
        at 
com.gemstone.gemfire.management.internal.cli.CommandManager.<init>(CommandManager.java:86)
        at 
com.gemstone.gemfire.management.internal.cli.CommandManager.getInstance(CommandManager.java:278)
        at 
com.gemstone.gemfire.management.internal.cli.CommandManager.getInstance(CommandManager.java:258)
        at 
com.gemstone.gemfire.management.internal.cli.remote.CommandProcessor.<init>(CommandProcessor.java:58)
        ...
{noformat}

The problem here is in {{ClasspathScanLoadHelper.getClasses()}}. In this method 
we call:
{noformat}
Enumeration<URL> resources = 
ClassPathLoader.getLatest().getResources(packagePath);
{noformat}
However {{getResources()}} doesn't just work against the 'latest' classloader, 
but also considers the thread context classloader. In the case of a Spring Boot 
app, Spring does provide such a classloader and {{getResources}} is able to 
find the necessary resources {{CommandMarker}} classes. (These classes are 
found within a nested jar. For ex. 
{{jar:file:/Users/jdeppe/src/woddrive/WodDrive-GF-Server/target/WodDriveGFServer.jar!/lib/gemfire-core-1.0.0-incubating-SNAPSHOT.jar!/com/gemstone/gemfire/management/internal/cli/commands}}).
 This is all fine, but subsequent code doesn't consider classes (or packages) 
within nested jars, and in addition, when classes actually get resolved, the 
thread context classloader (where those resources might have come from) is not 
considered.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to