Liquibase java not applying changesets

Hi,



I'm using Liquibase directly from Java 8, after adding the Maven dependency for Liquibase 3.4.0.
My project includes some database interactions with an Oracle 11g database (I included ojdbc6.jar in the build path and liquibase-oracle-3.0.0.jar as a maven dependency). My changelog is composed with a single changeset of creating a table if it doesn't exist (precondition with onSQLOutput="TEST"). When I run this changelog with the command line, everything works fine, but when I launch it with my Java application, something goes wrong (my simplified java code is written down below).
With the update action, this task simply does nothing. With updateSQL or futureRollbackSQL, it generates a file creating the tables of Liquibase (databasechangelog and databasechangeloglock), but does not include my changeset.
I'm 100% sure that the table does not exist on the given database.

I'm a little lost now, I don't know what to do or what's wrong. I checked at some examples from other topics, but I can't see any error in my code in my code (well... there should be one, obviously). Even posted this question on stackoverflow and didn't get any answer.

So I would be very grateful if you could help me point out my mistake(s) on this application !

Tell me if you need more details.

Thank you for your answers.

Java Code

Connection
c = null;
Database
database = null;
PrintWriter
pw = null;
File
file = null;
liquibase.Liquibase
liquibase = null;
contexts
= db+"."+user;
try {

pw = new PrintWriter(new FileWriter(file));

// Get connection

c = SQLManager.getInstance().getConnection(db, user, passwd);

// Get liquibase connection

database =
DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection©);

liquibase = new liquibase.Liquibase(new
DatabaseChangeLog(fsource), new FileSystemResourceAccessor(),

      database);

// Run liquibase action

switch (realAction) {

  case Constants.LIQUIBASE_ACTION_FUTUREROLLBACKSQL:

      liquibase.futureRollbackSQL(pw);

      break;

  case Constants.LIQUIBASE_ACTION_UPDATESQL:

      liquibase.update(contexts, pw);

      break;

  case Constants.LIQUIBASE_ACTION_UPDATE:

      liquibase.update(contexts);

      if (!c.getAutoCommit())

          c.commit();

      break;

  default:

      throw new RuntimeException("Action not implemented");

}

pw.close();

database.close();

c.close();
}
catch (IOException | SQLException | LiquibaseException e) {

throw new Exception(e.getMessage());
}
finally {

if (c != null) {

  try {

      c.close();

  } catch (SQLException e) {

      throw new RuntimeException(e.getClass() + ": "
  • e.getMessage());

    }
    

    }
    }

See my reply on StackOverflow

Steve Donie
Principal Software Engineer
Datical, Inc. http://www.datical.com/

I got the logs in debug mode, unfortunately it doesn’t tell much,
just that he doesn’t seem to go through changesets, whatever the
action is set to:

DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: select count(*) from MYSCHEMA.DATABASECHANGELOGLOCK DEBUG 06/08/15 09:28: liquibase: Create Database Lock Table DEBUG 06/08/15 09:28: liquibase: Executing EXECUTE database command: CREATE TABLE MYSCHEMA.DATABASECHANGELOGLOCK (ID NUMBER(10) NOT NULL, LOCKED NUMBER(1) NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR2(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID)) DEBUG 06/08/15 09:28: liquibase: Created database lock table with name: MYSCHEMA.DATABASECHANGELOGLOCK DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: select count(*) from MYSCHEMA.DATABASECHANGELOGLOCK DEBUG 06/08/15 09:28: liquibase: Initialize Database Lock Table DEBUG 06/08/15 09:28: liquibase: Executing EXECUTE database command: DELETE FROM MYSCHEMA.DATABASECHANGELOGLOCK DEBUG 06/08/15 09:28: liquibase: Executing EXECUTE database command: INSERT INTO MYSCHEMA.DATABASECHANGELOGLOCK (ID, LOCKED) VALUES (1, 0) DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: SELECT LOCKED FROM MYSCHEMA.DATABASECHANGELOGLOCK WHERE ID=1 FOR UPDATE DEBUG 06/08/15 09:28: liquibase: Lock Database DEBUG 06/08/15 09:28: liquibase: Executing UPDATE database command: UPDATE MYSCHEMA.DATABASECHANGELOGLOCK SET LOCKED = 1, LOCKEDBY = 'CRO09177 (xx.xx.xx.xxx)', LOCKGRANTED = to_date('2015-08-06 09:28:28', 'YYYY-MM-DD HH24:MI:SS') WHERE ID = 1 AND LOCKED = 0 INFO 06/08/15 09:28: liquibase: Successfully acquired change log lock DEBUG 06/08/15 09:28: liquibase: Create Database Change Log Table INFO 06/08/15 09:28: liquibase: Creating database history table with name: MYSCHEMA.DATABASECHANGELOG DEBUG 06/08/15 09:28: liquibase: Executing EXECUTE database command: CREATE TABLE MYSCHEMA.DATABASECHANGELOG (ID VARCHAR2(255) NOT NULL, AUTHOR VARCHAR2(255) NOT NULL, FILENAME VARCHAR2(255) NOT NULL, DATEEXECUTED TIMESTAMP NOT NULL, ORDEREXECUTED NUMBER(10) NOT NULL, EXECTYPE VARCHAR2(10) NOT NULL, MD5SUM VARCHAR2(35), DESCRIPTION VARCHAR2(255), COMMENTS VARCHAR2(255), TAG VARCHAR2(255), LIQUIBASE VARCHAR2(20), CONTEXTS VARCHAR2(255), LABELS VARCHAR2(255)) DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: select count(*) from MYSCHEMA.DATABASECHANGELOG INFO 06/08/15 09:28: liquibase: Reading from MYSCHEMA.DATABASECHANGELOG DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: SELECT FILENAME,AUTHOR,ID,MD5SUM,DATEEXECUTED,ORDEREXECUTED,EXECTYPE,DESCRIPTION,COMMENTS,TAG,LIQUIBASE,LABELS,CONTEXTS FROM MYSCHEMA.DATABASECHANGELOG ORDER BY DATEEXECUTED ASC, ORDEREXECUTED ASC DEBUG 06/08/15 09:28: liquibase: Executing QUERY database command: select count(*) from MYSCHEMA.DATABASECHANGELOGLOCK DEBUG 06/08/15 09:28: liquibase: Release Database Lock DEBUG 06/08/15 09:28: liquibase: Executing UPDATE database command: UPDATE MYSCHEMA.DATABASECHANGELOGLOCK SET LOCKED = 0, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1 INFO 06/08/15 09:28: liquibase: Successfully released change log lock
Oh and I can't change back to Java 1.7, I'm already using too much of Java 1.8 features to consider rolling back (besides, you can't live without lambda expressions and streams after having a taste of them !)