[
https://issues.apache.org/jira/browse/GEODE-800?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jens Deppe updated GEODE-800:
-----------------------------
Component/s: (was: management)
gfsh
configuration
> 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: configuration, gfsh
> 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)