我尝试在使用 Liquibase CDI 时注入 searchPath 参数,但下面的方法似乎都不起作用。由于情况超出我的控制范围,这是我修改 liquibase 设置的唯一方法。
// LiquibaseProducer.java
package de.XXXX.XXXX.liquibase;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Produces;
import javax.sql.DataSource;
import liquibase.integration.cdi.CDILiquibaseConfig;
import liquibase.integration.cdi.annotations.LiquibaseType;
import liquibase.resource.ClassLoaderResourceAccessor;
import liquibase.resource.ResourceAccessor;
/**
* CDI Producer to configure the CDI Liquibase integration.
*/
@Dependent
public class LiquibaseProducer {
/** Used liquibase author. */
public static final String LIQUIBASE_AUTHOR = "liquibase-auto";
/** Datasource. */
@Resource(mappedName = "XXXXXXXXX", name = "XXXXXX", type = DataSource.class)
private DataSource dataSource;
/** Creating the liquibase configuration. */
@SuppressWarnings("static-method")
@Produces
@LiquibaseType
public CDILiquibaseConfig createConfig() {
CDILiquibaseConfig tConfig = new CDILiquibaseConfig();
Map<String, String> tempMap = new HashMap<>();
tempMap.put("searchPath", "./testpath");
tempMap.put("search-path", "./testpaaaath/");
tempMap.put("search-path", "LIQUIBASE_SEARCH_PATH=./testingpath");
tempMap.put("liquibase.searchPath", "./testpathxyyz");
tConfig.setParameters(tempMap);
tConfig.setChangeLog("db/changelog/init.xml");
return tConfig;
}
/** Creating the Datasource. */
@Produces
@LiquibaseType
public DataSource createDataSource() throws SQLException {
return dataSource;
}
/** Creating the ResourceAccessor. */
@Produces
@LiquibaseType
public ResourceAccessor create() {
return new ClassLoaderResourceAccessor(getClass().getClassLoader());
}
}
这些参数用作变更日志参数,而不是 liquibase 参数:这就是它们不起作用的原因。您需要在范围内设置它,但我看不到在 CDI 中执行此操作的方法。
也许您可以设置 ResourceAcessor 并根据您的需要驯服它。我猜 CDI 使用 DirectoryResourceAcessor 但您可以创建一个更适合您需求的,例如 Maven 插件中使用的 SearchPath。