'SpringLiquibase with Liquibase 4 and FileSystemResourceLoader

I'm currently facing a problem. My project looks like this :
Project
|_ module 1
   |_ liquibase
      |_ migration.xml
      |_ file1.xml
   |_ src
      |_ main
         |_ java
         |_ resources

To be able to launch component tests, I run, using docker, a postgresql container. I want to launch my liquibase scripts.

Here's a my code :

        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setResourceLoader(new FileSystemResourceLoader());
        liquibase.setDataSource(dataSource);
        liquibase.setChangeLog("liquibase/migration.xml");
        liquibase.setDefaultSchema("mySchema");
        liquibase.setDropFirst(false);
        liquibase.setShouldRun(true);
        try {
            liquibase.afterPropertiesSet();
            log.info("Liquibase run ended");
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new RuntimeException(e.getMessage());
        }

This has run well for a long time, until I made an update to Liquibase 4. Now, I'm getting the following error : Specifying files by absolute path was removed in Liquibase 4.0. Please use a relative path or add '/' to the classpath parameter.

I searched throught the web and didn't find anything helpful. I tried a lot of different things, and nothing worked

Someone has a clue ? (other than moving my liquibase folder inside resources)



Solution 1:[1]

I worked it out implementing custom SpringLiquibase and SpringResourceAcessor and moving from liquibase 4.0 to 4.6.1

If anyone is interested, here's my code :

public class CustomSpringResourceAcessor extends SpringResourceAccessor {


    public CustomSpringResourceAcessor(ResourceLoader resourceLoader) {
        super(resourceLoader);
    }

    @Override
    protected String finalizeSearchPath(String searchPath) {
        return super.finalizeSearchPath(searchPath).substring(11);
    }

    @Override
    public InputStreamList openStreams(String relativeTo, String streamPath) throws IOException {
        String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
        path = path.substring(0, path.indexOf("/target"));

        if (relativeTo == null) {
            return super.openStreams(path, streamPath);
        }

        return super.openStreams(path + "/" + relativeTo, streamPath);
    }
}

and

public class CustomSpringLiquibase extends SpringLiquibase {
    @Override
    protected SpringResourceAccessor createResourceOpener() {
        return new CustomSpringResourceAcessor(getResourceLoader());
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 spark82