diff --git a/liquibase-core/src/main/java/liquibase/resource/ClassLoaderResourceAccessor.java b/liquibase-core/src/main/java/liquibase/resource/ClassLoaderResourceAccessor.java index 892820a6acc..a07b1e2bb75 100644 --- a/liquibase-core/src/main/java/liquibase/resource/ClassLoaderResourceAccessor.java +++ b/liquibase-core/src/main/java/liquibase/resource/ClassLoaderResourceAccessor.java @@ -24,7 +24,7 @@ * * @see OSGiResourceAccessor for OSGi-based classloaders */ -public class ClassLoaderResourceAccessor extends AbstractResourceAccessor { +public class ClassLoaderResourceAccessor extends AbstractResourceAccessor implements AutoCloseable { private ClassLoader classLoader; protected List rootPaths; @@ -270,7 +270,7 @@ protected SortedSet listFromClassLoader(String path, boolean recursive, try (JarFile jar = new JarFile(URLDecoder.decode(jarPath, StandardCharsets.UTF_8.name()))) { String comparePath = path; if (comparePath.startsWith("/")) { - comparePath = "/"+comparePath; + comparePath = "/" + comparePath; } Enumeration entries = jar.entries(); while (entries.hasMoreElements()) { @@ -355,4 +355,17 @@ public SortedSet describeLocations() { return description; } + + @Override + public void close() throws Exception { + if (rootPaths != null) { + for (final FileSystem rootPath : rootPaths) { + try { + rootPath.close(); + } catch (final Exception e) { + Scope.getCurrentScope().getLog(getClass()).fine("Cannot close path " + e.getMessage(), e); + } + } + } + } } diff --git a/liquibase-core/src/test/groovy/liquibase/resource/ClassLoaderResourceAccessorTest.groovy b/liquibase-core/src/test/groovy/liquibase/resource/ClassLoaderResourceAccessorTest.groovy index ac752a8dac1..9a62aeeaaf1 100644 --- a/liquibase-core/src/test/groovy/liquibase/resource/ClassLoaderResourceAccessorTest.groovy +++ b/liquibase-core/src/test/groovy/liquibase/resource/ClassLoaderResourceAccessorTest.groovy @@ -5,6 +5,8 @@ import liquibase.util.StreamUtil import spock.lang.Specification import spock.lang.Unroll +import java.nio.file.FileSystem + class ClassLoaderResourceAccessorTest extends Specification { def testResourceAccessor = new ClassLoaderResourceAccessor(new URLClassLoader( @@ -153,4 +155,23 @@ class ClassLoaderResourceAccessorTest extends Specification { ], ] } + + def close() { + setup: + FileSystem path1 = Mock() + FileSystem path2 = Mock() + + when: + def testAccessor = new ClassLoaderResourceAccessor(this.getClass().getClassLoader()) + + testAccessor.rootPaths = null; + testAccessor.close() //no errors thrown from close() when rootPaths is null + + testAccessor.rootPaths = [path1, path2] + testAccessor.close() + + then: + 2 * path1.close() + 1 * path2.close() + } }