From 848a3b88886529d2fda946a97bdc6fecf59e2299 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Wed, 28 Oct 2015 15:45:09 +1300 Subject: [PATCH] #444 - Spring Boot classpath scanning not finding entity beans --- .../server/util/ClassPathSearch.java | 14 +++++++++++-- .../server/util/ClassPathSearchFilter.java | 20 ++++++++++--------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/avaje/ebeaninternal/server/util/ClassPathSearch.java b/src/main/java/com/avaje/ebeaninternal/server/util/ClassPathSearch.java index f40653b05..3b4980647 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/util/ClassPathSearch.java +++ b/src/main/java/com/avaje/ebeaninternal/server/util/ClassPathSearch.java @@ -157,7 +157,7 @@ public class ClassPathSearch implements ClassPathSearchService { } else if (element.isJarOrWar()) { // search name including the ! offset if it is there - if (classPathSize == 1 || filter.isSearchJar(element.getJarNameWithOffset())) { + if (classPathSize == 1 || filter.isSearchJar(element.getJarNameWithOffset(), element.getJarOffset())) { scanJar(element); } @@ -234,6 +234,8 @@ public class ClassPathSearch implements ClassPathSearchService { File file = classPathEntry.classPath; module = new JarFile(file); + logger.trace("scanJar file:{}", file); + List classPathFromManifest = getClassPathFromManifest(file, module.getManifest()); for (URI uri : classPathFromManifest) { scanUri(uri); @@ -303,7 +305,11 @@ public class ClassPathSearch implements ClassPathSearchService { * prefix. We want to come out with a name like WEB-INF/classes/ to ensure * we filter the contents of the war/jar file by this. */ - if (jarOffset != null) { + if ("/".equals(jarOffset)) { + // root level for runnable jar (spring boot etc) + jarOffset = null; + + } else if (jarOffset != null) { if (jarOffset.startsWith("/")) { jarOffset = jarOffset.substring(1); } @@ -498,6 +504,10 @@ public class ClassPathSearch implements ClassPathSearchService { String getJarNameWithOffset() { return (jarOffset == null) ? classPath.getName() : classPath.getName() + "!" + jarOffset; } + + String getJarOffset() { + return jarOffset; + } } } \ No newline at end of file diff --git a/src/main/java/com/avaje/ebeaninternal/server/util/ClassPathSearchFilter.java b/src/main/java/com/avaje/ebeaninternal/server/util/ClassPathSearchFilter.java index 9eedb7d1c..d84d0b757 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/util/ClassPathSearchFilter.java +++ b/src/main/java/com/avaje/ebeaninternal/server/util/ClassPathSearchFilter.java @@ -122,17 +122,19 @@ public class ClassPathSearchFilter { /** * Return true if the jar should be included in the search. */ - public boolean isSearchJar(String jarName) { + public boolean isSearchJar(String jarName, String jarOffset) { - if (containedIn(includeJarSet, jarName)) { - return true; - } + if (containedIn(includeJarSet, jarName)) { + return true; + } - if (containedIn(excludeJarSet, jarName)) { - return false; - } - return defaultJarMatch; - } + if (containedIn(excludeJarSet, jarName)) { + return false; + } + + // by default scan the root level in runnable jar (spring boot etc) + return "/".equals(jarOffset) || defaultJarMatch; + } /** * Helper method to determine is a match is contained in the set.