Upgrade to Liquibase 3.3.0

This commit updates Spring Boot to Liquibase 3.3.0 and makes the
necessary changes to Boot's PackageScanClassResolver.

Previously, when a class found by the scan could not be loaded a
warning message was logged. This commit lowers these to debug level,
bringing them into line with logging that the standard Liquibase
implementation does. It also avoids a warning always being logged at
startup due to Liquibase's WatchCommand$DynamicContentHandler which
depends on Jetty (an optional dependency of Liquibase).

Closes gh-1382
This commit is contained in:
Nathan Voxland 2014-10-21 15:43:36 -05:00 committed by Andy Wilkinson
parent a3d4e92d9f
commit ce4400291b
2 changed files with 17 additions and 11 deletions

View File

@ -92,7 +92,7 @@
<json-path.version>0.9.1</json-path.version> <json-path.version>0.9.1</json-path.version>
<jstl.version>1.2</jstl.version> <jstl.version>1.2</jstl.version>
<junit.version>4.11</junit.version> <junit.version>4.11</junit.version>
<liquibase.version>3.0.8</liquibase.version> <liquibase.version>3.3.0</liquibase.version>
<log4j.version>1.2.17</log4j.version> <log4j.version>1.2.17</log4j.version>
<log4j2.version>2.0.2</log4j2.version> <log4j2.version>2.0.2</log4j2.version>
<logback.version>1.1.2</logback.version> <logback.version>1.1.2</logback.version>

View File

@ -17,11 +17,9 @@
package org.springframework.boot.liquibase; package org.springframework.boot.liquibase;
import java.io.IOException; import java.io.IOException;
import java.util.Set;
import liquibase.servicelocator.DefaultPackageScanClassResolver; import liquibase.servicelocator.DefaultPackageScanClassResolver;
import liquibase.servicelocator.PackageScanClassResolver; import liquibase.servicelocator.PackageScanClassResolver;
import liquibase.servicelocator.PackageScanFilter;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
@ -48,16 +46,15 @@ public class SpringPackageScanClassResolver extends DefaultPackageScanClassResol
} }
@Override @Override
protected void find(PackageScanFilter test, String packageName, ClassLoader loader, protected void findAllClasses(String packageName, ClassLoader loader) {
Set<Class<?>> classes) {
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory( MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(
loader); loader);
try { try {
Resource[] resources = scan(loader, packageName); Resource[] resources = scan(loader, packageName);
for (Resource resource : resources) { for (Resource resource : resources) {
Class<?> candidate = loadClass(loader, metadataReaderFactory, resource); Class<?> clazz = loadClass(loader, metadataReaderFactory, resource);
if (candidate != null && test.matches(candidate)) { if (clazz != null) {
classes.add(candidate); addFoundClass(clazz);
} }
} }
} }
@ -80,12 +77,21 @@ public class SpringPackageScanClassResolver extends DefaultPackageScanClassResol
MetadataReader reader = readerFactory.getMetadataReader(resource); MetadataReader reader = readerFactory.getMetadataReader(resource);
return ClassUtils.forName(reader.getClassMetadata().getClassName(), loader); return ClassUtils.forName(reader.getClassMetadata().getClassName(), loader);
} }
catch (Exception ex) { catch (NoClassDefFoundError ex) {
if (this.logger.isWarnEnabled()) { handleFailure(resource, ex);
this.logger.warn("Ignoring cadidate class resource " + resource, ex); return null;
} }
catch (Exception ex) {
handleFailure(resource, ex);
return null; return null;
} }
} }
private void handleFailure(Resource resource, Throwable ex) {
if (this.logger.isDebugEnabled()) {
this.logger.debug("Ignoring candidate class resource " + resource
+ " due to " + ex);
}
}
} }