class AbstractLiquibaseChangeLogMojo extends AbstractLiquibaseMojo {

    /**
   * Specifies the directory where Liquibase can find your <i>changelog</i> file. This is an aliases for searchPath
     *
   * @parameter property="liquibase.changeLogDirectory"
     */
    @PropertyElement
    protected String changeLogDirectory;

    /**
     * Specifies the <i>changelog</i> file for Liquibase to use.
     *
     * @parameter property="liquibase.changeLogFile"
     */
    @PropertyElement
    protected String changeLogFile;


    /**
     * Specifies which contexts Liquibase will execute, which can be separated by a comma if multiple contexts
      are required.
   * If a context is not specified, then ALL contexts will be executed.
     *
     * @parameter property="liquibase.contexts" default-value=""
     */
    @PropertyElement
    protected String contexts;

    /**
     * Deprecated version of labelFilter
     *
     * @parameter property="liquibase.labels" default-value=""
     * @deprecated
     */
    @PropertyElement
    protected String labels;

    /**
     * Specifies which Liquibase labels Liquibase will execute, which can be separated by a comma if multiple labels
     are required or you need to designate a more complex expression.
     * If a label is not specified, then ALL labels will be executed.
     *
     * @parameter property="liquibase.labelFilter" default-value=""
     */
    @PropertyElement
    protected String labelFilter;


    /**
     * How to handle multiple files being found in the search path that have duplicate paths.
     * Options are WARN (log warning and choose one at random) or ERROR (fail current operation)
     *
     * @parameter property="liquibase.duplicateFileMode" default-value="ERROR"
     */
    @PropertyElement
    protected String duplicateFileMode;

    @Override
    protected void checkRequiredParametersAreSpecified() throws MojoFailureException {
        super.checkRequiredParametersAreSpecified();

        if (changeLogFile == null) {
            throw new MojoFailureException("The changeLogFile must be specified.");
        }
    }

    /**
     * Performs the actual Liquibase task on the database using the fully configured {@link
     * liquibase.Liquibase}.
     *
     * @param liquibase The {@link liquibase.Liquibase} that has been fully
     *                  configured to run the desired database task.
     */
    @Override
    protected void performLiquibaseTask(Liquibase liquibase) throws LiquibaseException {
        if (StringUtil.isNotEmpty(duplicateFileMode)) {
            DeprecatedConfigurationValueProvider.setData(GlobalConfiguration.DUPLICATE_FILE_MODE.getKey(), GlobalConfiguration.DuplicateFileMode.valueOf(duplicateFileMode.toUpperCase(Locale.ROOT)));
        }
    }

    @Override
    protected void printSettings(String indent) {
        super.printSettings(indent);
        getLog().info(indent + "changeLogDirectory: " + changeLogDirectory);
        getLog().info(indent + "changeLogFile: " + changeLogFile);
        getLog().info(indent + "context(s): " + contexts);
        getLog().info(indent + "label(s): " + getLabelFilter());
    }

    @Override
    protected ResourceAccessor getResourceAccessor(ClassLoader cl) throws IOException, MojoFailureException {<FILL_FUNCTION_BODY>}

    @Override
    protected Liquibase createLiquibase(Database db) throws MojoExecutionException {

        String changeLog = (changeLogFile == null) ? "" : changeLogFile.trim();
        return new Liquibase(changeLog, Scope.getCurrentScope().getResourceAccessor(), db);

    }

    private void calculateChangeLogDirectoryAbsolutePath() {
        if (changeLogDirectory != null) {
            // convert to standard / if using absolute path on windows
            changeLogDirectory = changeLogDirectory.trim().replace('\\', '/');
            // try to know if it's an absolute or relative path : the absolute path case is simpler and don't need more actions
            File changeLogDirectoryFile = new File(changeLogDirectory);
            if (!changeLogDirectoryFile.isAbsolute()) {
                // we are in the relative path case
                changeLogDirectory = project.getBasedir().getAbsolutePath().replace('\\', '/') + "/" + changeLogDirectory;
            }
        }
    }

    public String getLabelFilter() {
        if (labelFilter == null) {
            return labels;
        }
        return labelFilter;
    }
}

        List<ResourceAccessor> resourceAccessors = new ArrayList<>();
        resourceAccessors.add(new MavenResourceAccessor(cl));
        resourceAccessors.add(new DirectoryResourceAccessor(project.getBasedir()));
        resourceAccessors.add(new ClassLoaderResourceAccessor(getClass().getClassLoader()));

        String finalSearchPath = searchPath;

        if (changeLogDirectory != null) {
            if (searchPath != null) {
                throw new MojoFailureException("Cannot specify searchPath and changeLogDirectory at the same time");
            }
            calculateChangeLogDirectoryAbsolutePath();
            finalSearchPath = changeLogDirectory;
        }

        return new SearchPathResourceAccessor(finalSearchPath, resourceAccessors.toArray(new ResourceAccessor[0]));
    
<methods>public non-sealed void <init>() ,public void configureFieldsAndValues() throws MojoExecutionException,public boolean databaseConnectionRequired() ,public void execute() throws MojoExecutionException, MojoFailureException,public synchronized Log getLog() ,public void setPassword(java.lang.String) throws java.lang.Exception,public void setUrl(java.lang.String) throws java.lang.Exception,public void setUsername(java.lang.String) throws java.lang.Exception<variables>private static final java.lang.String DEFAULT_FIELD_SUFFIX,private static final Set<java.lang.String> EXCLUDED_CONFIGURATION_PROPERTIES,protected java.lang.String changeExecListenerClass,protected java.lang.String changeExecListenerPropertiesFile,protected java.lang.String changelogCatalogName,protected java.lang.String changelogSchemaName,protected boolean clearCheckSums,protected java.lang.String commandName,private static final java.util.ResourceBundle coreBundle,protected java.lang.String databaseChangeLogLockTableName,protected java.lang.String databaseChangeLogTableName,protected java.lang.Boolean databaseChangelogHistoryCaptureExtensions,protected java.lang.Boolean databaseChangelogHistoryCaptureSql,protected java.lang.Boolean databaseChangelogHistoryEnabled,protected java.lang.String databaseClass,protected java.lang.Boolean dbclHistoryCaptureExtensions,protected java.lang.Boolean dbclHistoryCaptureSql,protected java.lang.Boolean dbclHistoryEnabled,protected java.lang.String defaultCatalogName,protected liquibase.changelog.visitor.DefaultChangeExecListener defaultChangeExecListener,protected java.lang.String defaultSchemaName,protected java.lang.String driver,private java.io.File driverPropertiesFile,protected boolean emptyPassword,private Map#RAW expressionVariables,private java.util.Properties expressionVars,protected boolean includeArtifact,protected boolean includeTestOutputDirectory,private liquibase.Liquibase liquibase,private java.lang.String liquibaseLicenseKey,private java.lang.String liquibaseProLicenseKey,private org.liquibase.maven.plugins.MavenLog logCache,protected java.lang.String logFormat,protected java.lang.String logLevel,protected java.lang.String logging,protected MojoExecution mojoExecution,protected boolean outputDefaultCatalog,protected boolean outputDefaultSchema,protected java.lang.String outputFileEncoding,protected java.lang.String password,protected java.lang.Boolean preserveSchemaCase,protected MavenProject project,protected boolean promptOnNonLocalDatabase,protected java.lang.String propertyFile,protected boolean propertyFileWillOverride,protected java.lang.String propertyProviderClass,protected java.lang.String psqlArgs,protected java.lang.Boolean psqlKeepTemp,protected java.lang.String psqlKeepTempName,protected java.lang.String psqlKeepTempPath,protected java.lang.String psqlLogFile,protected java.lang.String psqlPath,protected java.lang.Integer psqlTimeout,protected java.lang.String searchPath,private java.lang.String server,protected MavenSession session,protected boolean showBanner,protected boolean skip,protected java.lang.String skipOnFileExists,protected java.lang.String sqlPlusArgs,protected java.lang.Boolean sqlPlusKeepTemp,protected java.lang.String sqlPlusKeepTempName,protected java.lang.Boolean sqlPlusKeepTempOverwrite,protected java.lang.String sqlPlusKeepTempPath,protected java.lang.String sqlPlusLogFile,protected java.lang.String sqlPlusPath,protected java.lang.Integer sqlPlusTimeout,protected java.lang.String sqlcmdArgs,protected java.lang.String sqlcmdCatalogName,protected java.lang.Boolean sqlcmdKeepTemp,protected java.lang.String sqlcmdKeepTempName,protected java.lang.Boolean sqlcmdKeepTempOverwrite,protected java.lang.String sqlcmdKeepTempPath,protected java.lang.String sqlcmdLogFile,protected java.lang.String sqlcmdPath,protected java.lang.Integer sqlcmdTimeout,protected java.util.Properties systemProperties,protected java.lang.String url,protected java.lang.String username,protected boolean verbose,protected WagonManager wagonManager