JHipster Liquibase startup failures: diagnose checksum mismatches, locks and missing changelogs
A practical diagnostic guide for JHipster Spring Boot apps that fail to start due to Liquibase checksum mismatches, changelog locks, or missing changelogs. Includes checks, fixes, and escalation criteria.
09 Aug 2026, 22:16 UTC

Recognizable condition
A JHipster-generated Spring Boot monolith or microservice fails to start. The application context does not load, the health check stays DOWN in JHipster Registry or Kubernetes, and the logs show a Liquibase error during bootstrap.
Typical log signatures are:
- Validation Failed: checksum mismatch for a changelog
- ChangeLog lock held by another instance
- Missing changelog file or resource not found
The service is unusable until Liquibase validation passes. The problem is usually environment-specific and appears after a code merge, a redeploy, or a crash during migration.
Cause to symptom table
| Symptom in logs | Common cause in JHipster projects | Where it appears |
|---|---|---|
| checksum mismatch for changeSet | An already executed changelog file was edited, or line endings / whitespace changed between developers. Also caused by re-applying a changeSet with a different id. | Dev, CI, or prod after a hotfix to an old changelog |
| ChangeLog lock held by another instance | Previous startup crashed or was killed before Liquibase released DATABASECHANGELOGLOCK. Common with rolling deployments and microservices. | Any environment with multiple instances or abrupt termination |
| Missing changelog resource | File not present in src/main/resources/config/liquibase/changelog, excluded by profile, or not packaged into the jar. spring.liquibase.contexts filters out the file. | New branch, wrong profile, bad build |
| duplicate changeSet id | Copy-paste of a changeSet across branches or modules sharing a database. | Microservice layout with shared DB or merge conflict |
Ordered checks
1. Read the exact Liquibase error
Run logs for the failing instance. In Kubernetes:
kubectl logs <pod-name> -c app | grep -i liquibaseLook for the changelog name, changeSet id, and the error type. The log tells you which file and which table to inspect next.
2. Inspect DATABASECHANGELOG and DATABASECHANGELOGLOCK
Connect to the database with read permission. Use your DB client with credentials from the environment.
-- PostgreSQL example
SELECT ID, AUTHOR, FILENAME, DATEEXECUTED, MD5SUM
FROM DATABASECHANGELOG
WHERE FILENAME LIKE '%<changelog-file>%'
ORDER BY DATEEXECUTED DESC;SELECT LOCKED, LOCKEDBY, LOCKGRANTED
FROM DATABASECHANGELOGLOCK;LOCKED = true with an old LOCKGRANTED indicates a stale lock. A recorded MD5SUM that differs from the file indicates a checksum mismatch.
3. Compare changelog files to git history
On a developer machine with repo access:
git log --oneline -- src/main/resources/config/liquibase/changelog/
git diff HEAD~1 -- src/main/resources/config/liquibase/changelog/<file>.xmlEdits to files that are already present in DATABASECHANGELOG are the root cause of checksum mismatches.
4. Verify profile and contexts
JHipster uses spring profiles and spring.liquibase.contexts to select changelogs. Check application.yml / application-prod.yml:
spring:
liquibase:
contexts: prod
change-log: classpath:config/liquibase/master.xmlEnsure the profile active on the failing instance matches the changelog set you expect. A missing file can be a packaging issue, not a DB issue.
Fixes tied to findings
Checksum mismatch
Development: revert the edit to the already executed file and create a new changeSet with a new id and author. Do not change the original changeSet.
Non-production only: after confirming no production impact, you can accept the new checksum. This is not safe for production.
Caution: Do not edit already executed Liquibase changelogs in production. Changes must be made in new changeSets to preserve auditability.
Stale changelog lock
Confirm no JHipster instance is currently running migrations. Check running pods, processes, and JHipster Registry registrations.
Release the lock manually with DB write permission:
UPDATE DATABASECHANGELOGLOCK SET LOCKED = FALSE, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1;Risk: releasing the lock while another instance is migrating can cause concurrent execution and data corruption. Only do this after confirming the environment is quiescent.
Missing changelog
Restore the file from version control to src/main/resources/config/liquibase/changelog and rebuild:
mvn clean package -PprodVerify the file is in the jar:
jar tf target/*.jar | grep liquibase/changelogThen restart the service with the correct profile.
Duplicate changeSet id
Regenerate a unique id and author for the changeSet and move the logic to a new file. Reapply via a new migration. Never reuse an id that exists in DATABASECHANGELOG.
Escalation criteria
- Production database contains manual changes outside Liquibase. Requires DBA review before any checksum or lock operation.
- Lock release is unsafe due to concurrent writers or multiple JHipster microservices sharing a database.
- Migration requires data backfill, transformation, or rollback beyond clear-checksums or lock release.
- Multiple services share a database. Coordinate changes across teams to avoid cross-service changeSet collisions.
Verification
Start the application locally with the same profile and observe logs for Liquibase execution order and completion.
Query DATABASECHANGELOG to confirm the latest changeSet matches the files in src/main/resources/config/liquibase/changelog.
Run a clean build and package to verify changelog files are included in the jar and the application starts against a test database.
Limitations: This guide covers validation failures at startup. Runtime Liquibase errors during data migration, or issues with JHipster Registry service discovery, require separate diagnostics.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.