LiquiBase を使用してデータベースを管理することを計画しています。Web アプリケーションを Glassfish 3.1 にデプロイするたびに LiquiBase を実行したいと考えています。これを行うために、次のクラスを作成しました。
@Singleton
@Startup
public class LiquibaseWrapper {
@Resource(name = "jdbc/mydatabase")
private DataSource dataSource;
@PostConstruct
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void doLiquibaseUpdate() {
ResourceAccessor fileOpener = new ClassLoaderResourceAccessor();
DatabaseFactory databaseFactory = DatabaseFactory.getInstance();
Database database = null;
try {
database = databaseFactory
.findCorrectDatabaseImplementation(new Jdbc Connection(
dataSource.getConnection()));
Liquibase liquibase = new Liquibase("ChangeLog.xml",
fileOpener, database);
liquibase.update("");
} catch (DatabaseException e) {
// TODO: handle error
} catch (SQLException e) {
// TODO: handle error
} catch (LiquibaseException e) {
// TODO: handle error
}
}
}
問題は、アプリケーションを Eclipse 経由でサーバーにデプロイすると、doLiquiBaseUpdate() が実行されないことです。そこから WAR ファイルを作成し、手動でデプロイすると、メソッドが実行されます。
Eclipse を介してデプロイするときに doLiquiBaseUpdate() が実行されない理由が少しわかりません。
その他の潜在的に役立つ情報: - WAR は Maven 2 でビルドされています - JSF 2.1 を使用しています - データベースは MySQL です - LiquiBase 2.0.3 を使用しています - Eclipse Indigo と Glassfish サーバー ツール 1.7.3