Repository: incubator-brooklyn Updated Branches: refs/heads/master 6fe9fc762 -> 918c162b3
Sanitizes the classpath in CatalogClasspathDo to prevent issue when launching brooklyn with jsvc Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/bc44abf3 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/bc44abf3 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/bc44abf3 Branch: refs/heads/master Commit: bc44abf3e95c077d3fb38dee32a5180a308852dc Parents: 6fe9fc7 Author: Martin Harris <[email protected]> Authored: Tue Aug 25 16:50:43 2015 +0100 Committer: Martin Harris <[email protected]> Committed: Tue Aug 25 16:50:43 2015 +0100 ---------------------------------------------------------------------- .../catalog/internal/CatalogClasspathDo.java | 21 +++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/bc44abf3/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogClasspathDo.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogClasspathDo.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogClasspathDo.java index ffb7874..a8b7bbe 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogClasspathDo.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogClasspathDo.java @@ -179,7 +179,7 @@ public class CatalogClasspathDo { try { ((ManagementContextInternal)catalog.mgmt).setBaseClassPathForScanning(ClasspathHelper.forJavaClassPath()); log.debug("Catalog scan of default classloader returned nothing; reverting to java.class.path"); - baseCP = ((ManagementContextInternal)catalog.mgmt).getBaseClassPathForScanning(); + baseCP = sanitizeCP(((ManagementContextInternal) catalog.mgmt).getBaseClassPathForScanning()); scanner = new ReflectionScanner(baseCP, prefix, baseCL, catalog.getRootClassLoader()); } catch (Exception e) { log.info("Catalog scan is empty, and unable to use java.class.path (base classpath is "+baseCP+"): "+e); @@ -242,6 +242,25 @@ public class CatalogClasspathDo { isLoaded = true; } + private Iterable<URL> sanitizeCP(Iterable<URL> baseClassPathForScanning) { + /* + If Brooklyn is being run via apache daemon[1], and the classpath contains the contents of an empty folder, + (e.g. xxx:lib/patch/*:xxx) the classpath will be incorrectly expanded to include a zero-length string + (e.g. xxx::xxx), which is then interpreted by {@link org.reflections.Reflections#scan} as the root of the + file system. See [2], line 90+. This needs to be removed, lest we attempt to scan the entire filesystem + + [1]: http://commons.apache.org/proper/commons-daemon/ + [2]: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/unix/native/arguments.c?view=markup&pathrev=1196468 + */ + Iterables.removeIf(baseClassPathForScanning, new Predicate<URL>() { + @Override + public boolean apply(@Nullable URL url) { + return Strings.isEmpty(url.getFile()) || "/".equals(url.getFile()); + } + }); + return baseClassPathForScanning; + } + /** removes inner classes (non-static nesteds) and others; * bear in mind named ones will be hard to instantiate without the outer class instance) */ private <T> Iterable<Class<? extends T>> excludeInvalidClasses(Iterable<Class<? extends T>> input) {
