Download index.html from getreadystack/flyway-migration-check: direct link, hf CLI and curl.
- Browser
- Download file 54.4 kB
-
https://huggingface.co/spaces/getreadystack/flyway-migration-check/resolve/main/index.html
- Command line
-
hf download hf://spaces/getreadystack/flyway-migration-check/index.html
-
curl -L -o index.html https://huggingface.co/spaces/getreadystack/flyway-migration-check/resolve/main/index.html
54.4 kB
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| <title>Liquibase 5 license Check — find liquibase lines in your files</title> | |
| <meta name="description" content="This browser tool flags Liquibase Community 5.x lines in project and configuration files and shows a Flyway line for each."> | |
| <style> | |
| :root{color-scheme:light}body{margin:0;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif;background:#faf9f5;color:#1a1512} | |
| .wrap{max-width:960px;margin:0 auto;padding:28px 18px 60px}h1{font-size:26px;margin:0 0 6px}.lede{color:#4a403a;margin:0 0 16px} | |
| textarea{width:100%;min-height:260px;font:13px/1.45 ui-monospace,Menlo,Consolas,monospace;padding:12px;border:1px solid #d9d0c4;border-radius:8px;box-sizing:border-box} | |
| .bar{display:flex;gap:10px;align-items:center;margin:12px 0}button{font:600 15px system-ui;padding:10px 18px;border:0;border-radius:8px;background:#1a1512;color:#fff;cursor:pointer} | |
| input[type=date]{font:14px system-ui;padding:8px;border:1px solid #d9d0c4;border-radius:6px} | |
| table{border-collapse:collapse;width:100%;font-size:14px;margin-top:10px}th,td{text-align:left;padding:8px 10px;border-bottom:1px solid #eee;vertical-align:top}th{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#7a6e65} | |
| .sev.error{color:#a8551f;font-weight:700}.sev.warn,.sev.warning{color:#96691f}.ok{color:#2a6446;font-weight:600}.sum{font-weight:600} | |
| .note{font-size:13px;color:#7a6e65;margin-top:18px}#paid{margin-top:22px;padding:14px 16px;border:1px solid #e2d8cb;border-radius:10px;background:#fffdfa} | |
| </style> | |
| <script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script> | |
| <!--yj-canon-s101--><link rel="canonical" href="https://getreadystack.com/tools/flyway-migration-check"><style data-yj-mfit="1">#out{max-width:100%}#out td,#out th{overflow-wrap:break-word}#out th{white-space:nowrap}#out pre{white-space:pre-wrap;overflow-wrap:anywhere}#out code{white-space:pre-wrap;overflow-wrap:break-word}@media (max-width:640px){#out td,#out th{overflow-wrap:anywhere}#out th{white-space:normal}table{display:block;max-width:100%;overflow-x:auto}pre{max-width:100%;overflow-x:auto}code,a{overflow-wrap:anywhere}img,svg,video,canvas,iframe{max-width:100%}textarea,input,select{max-width:100%;box-sizing:border-box}.yj-lgbar{position:static;justify-content:flex-end;margin:0 0 10px}h1,h2,h3,h4,p,li,dd,dt,blockquote,figcaption,summary,label,.res,.lead{overflow-wrap:anywhere}label{max-width:100%;box-sizing:border-box}#out table:not(:has(tr>:nth-child(4))){display:table;table-layout:fixed;width:100%}#out table:has(tr>:nth-child(4)),#out table:has(tr>:nth-child(4)) tbody,#out table:has(tr>:nth-child(4)) tr,#out table:has(tr>:nth-child(4)) td{display:block;width:auto;overflow:visible}#out table:has(tr>:nth-child(4)) thead{display:none}#out table:has(tr>:nth-child(4)) tr{padding:10px 0;border-bottom:1px solid rgba(128,128,128,.28)}#out table:has(tr>:nth-child(4)) td{border:0;padding:1px 0}#out table:has(tr>:nth-child(4)) td:nth-child(-n+3){display:inline-block;margin-right:10px;font-size:12px;opacity:.78}}</style> | |
| </head> | |
| <body> | |
| <div class="wrap"> | |
| <h1>Liquibase 5 license Check — find liquibase lines in your files</h1> | |
| <p class="lede">Flyway migration check: flags Liquibase Community 5.x (FSL-1.1-ALv2) lines in pom.xml, Gradle, liquibase.properties, Spring config and changelogs, with the Flyway line for each. Runs entirely in your browser — nothing is uploaded.</p> | |
| <textarea id="src" spellcheck="false"><?xml version="1.0" encoding="UTF-8"?> | |
| <!-- pom.xml: orders-service, Spring Boot on PostgreSQL, still on Liquibase --> | |
| <project xmlns="http://maven.apache.org/POM/4.0.0"> | |
| <modelVersion>4.0.0</modelVersion> | |
| <groupId>com.example</groupId> | |
| <artifactId>orders-service</artifactId> | |
| <version>1.4.0</version> | |
| <properties> | |
| <java.version>17</java.version> | |
| <liquibase.version>5.0.1</liquibase.version> | |
| </properties> | |
| <dependencies> | |
| <dependency> | |
| <groupId>org.liquibase</groupId> | |
| <artifactId>liquibase-core</artifactId> | |
| <version>${liquibase.version}</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>org.postgresql</groupId> | |
| <artifactId>postgresql</artifactId> | |
| <scope>runtime</scope> | |
| </dependency> | |
| </dependencies> | |
| <build> | |
| <plugins> | |
| <plugin> | |
| <groupId>org.liquibase</groupId> | |
| <artifactId>liquibase-maven-plugin</artifactId> | |
| <version>${liquibase.version}</version> | |
| <configuration> | |
| <changeLogFile>db/changelog/db.changelog-master.yaml</changeLogFile> | |
| <contexts>prod</contexts> | |
| <rollbackCount>1</rollbackCount> | |
| </configuration> | |
| </plugin> | |
| </plugins> | |
| </build> | |
| </project></textarea> | |
| <div class="bar"><button id="go">Check</button><label>as of <input type="date" id="today"></label></div> | |
| <div id="out" aria-live="polite"></div> | |
| <div id="paid"><strong>Free here:</strong> Check the open pom.xml, Gradle file, liquibase.properties, Spring config or changelog for Liquibase 5 ties, with the Flyway line for each. <strong>In the editor:</strong> Scan the whole workspace into one Liquibase-to-Flyway migration plan, plus a dated licence exposure report and CI gate for the team — that part asks for a licence key. <a href="https://getreadystack.com/api/buy/cl/polar_cl_0Kv55ZFzhN92MA1VzdjIHNeqXLBNUW0gtNzfk1niwXt">Full version: whole-workspace Liquibase-to-Flyway migration plan, $29 once</a></div> | |
| <p class="note">Same engine as the VS Code extension, byte for byte.</p> | |
| </div> | |
| <script>var FW_RULES = [ | |
| {"id": "FW01", "check": "liquibase-fsl-version", "sev": "error", "kind": "lbver", | |
| "releases": {"5.0.0": "2025-09-30", "5.0.1": "2025-10-03", "5.0.2": "2026-03-05", "5.0.3": "2026-05-15", "5.0.4": "2026-08-20"}, | |
| "last_apache": "4.33.0", | |
| "msg": "Liquibase 5.0.0 and later ship under FSL-1.1-ALv2 (Functional Source License), not Apache-2.0. Flyway: replace it with \u003cflyway.version\u003e13.10.0\u003c/flyway.version\u003e (Flyway Community, Apache-2.0).", | |
| "msg_v4": "Liquibase 4.x is Apache-2.0 (4.33.0 is the last 4.x), but the next major bump by Dependabot or Renovate pulls 5.x under FSL-1.1-ALv2. Flyway: \u003cflyway.version\u003e13.10.0\u003c/flyway.version\u003e, or pin Liquibase below 5.", | |
| "msg_converted": "Under FSL each version turns Apache-2.0 two years after its release; this exact version has passed that date, newer 5.x releases have not. Flyway: \u003cflyway.version\u003e13.10.0\u003c/flyway.version\u003e.", | |
| "source": "https://docs.liquibase.com/community/release-notes/5-0"}, | |
| {"id": "FW02", "check": "liquibase-core-dependency", "sev": "error", "kind": "lbart", | |
| "re": "\u003cartifactId\u003e\\s*liquibase-core\\s*\u003c/artifactId\u003e|org\\.liquibase:liquibase-core(?!:\\s*\\d)", "flags": "", | |
| "msg": "liquibase-core dependency. Flyway: \u003cgroupId\u003eorg.flywaydb\u003c/groupId\u003e \u003cartifactId\u003eflyway-core\u003c/artifactId\u003e, plus the database module, e.g. flyway-database-postgresql.", | |
| "source": "https://repo1.maven.org/maven2/org/liquibase/liquibase-core/5.0.1/liquibase-core-5.0.1.pom"}, | |
| {"id": "FW03", "check": "liquibase-maven-plugin", "sev": "error", "kind": "lbart", | |
| "re": "\u003cartifactId\u003e\\s*liquibase-maven-plugin\\s*\u003c/artifactId\u003e|org\\.liquibase:liquibase-maven-plugin(?!:\\s*\\d)", "flags": "", | |
| "msg": "liquibase-maven-plugin. Flyway: \u003cgroupId\u003eorg.flywaydb\u003c/groupId\u003e \u003cartifactId\u003eflyway-maven-plugin\u003c/artifactId\u003e and run mvn flyway:migrate.", | |
| "source": "https://documentation.red-gate.com/fd/maven-goal-184127408.html"}, | |
| {"id": "FW04", "check": "liquibase-gradle-plugin", "sev": "warn", "kind": "regex", | |
| "re": "org\\.liquibase\\.gradle", "flags": "", | |
| "msg": "Liquibase Gradle plugin. Flyway: plugins { id \"org.flywaydb.flyway\" } and run gradle flywayMigrate.", | |
| "source": "https://documentation.red-gate.com/fd/gradle-task-184127407.html"}, | |
| {"id": "FW05", "check": "changelog-file-setting", "sev": "warn", "kind": "regex", | |
| "re": "changeLogFile|changelogFile|changelog-file|change-log\\s*[:=]", "flags": "i", | |
| "msg": "Liquibase changelog setting. Flyway has no master changelog; it reads versioned SQL files from locations: \u003clocations\u003e\u003clocation\u003eclasspath:db/migration\u003c/location\u003e\u003c/locations\u003e or spring.flyway.locations.", | |
| "source": "https://documentation.red-gate.com/fd/locations-224919713.html"}, | |
| {"id": "FW06", "check": "contexts-labels", "sev": "warn", "kind": "regex", | |
| "re": "\u003ccontexts\u003e|\u003clabels\u003e|\u003clabelFilter\u003e|(?:^|[.\\s-])contexts\\s*[:=]|label-?filter\\s*[:=]|--contexts\\b", "flags": "i", | |
| "msg": "Liquibase contexts or labels. Flyway has no per-changeset contexts; give each environment its own location (db/migration plus db/prod) and list them in locations.", | |
| "source": "https://documentation.red-gate.com/fd/locations-224919713.html"}, | |
| {"id": "FW07", "check": "rollback", "sev": "warn", "kind": "regex", | |
| "re": "\u003crollback(?:Count|Tag|Date)?\u003e|\\bliquibase(?:\\.bat)?\\s+rollback|liquibase:rollback|^\\s*-?\\s*rollback\\s*:|^\\s*--\\s*rollback\\b", "flags": "i", | |
| "msg": "Liquibase rollback. Flyway undo migrations are a Flyway Teams/Enterprise feature, not Community; plan a forward fix migration (V\u003cn+1\u003e__revert_x.sql) instead.", | |
| "source": "https://documentation.red-gate.com/fd/undo-184127535.html"}, | |
| {"id": "FW08", "check": "liquibase-secure-key", "sev": "info", "kind": "regex", | |
| "re": "licenseKey|LIQUIBASE_LICENSE_KEY|LIQUIBASE_PRO_LICENSE_KEY|liquibase\\.pro\\.", "flags": "i", | |
| "msg": "Liquibase Secure (commercial) licence key setting. Remove it once the Flyway migration is live, and note the seat in the licence review.", | |
| "source": "https://www.liquibase.com/pricing"}, | |
| {"id": "FW09", "check": "changelog-root", "sev": "warn", "kind": "regex", | |
| "re": "\u003cdatabaseChangeLog\\b|^\\s*databaseChangeLog\\s*:|\"databaseChangeLog\"\\s*:", "flags": "", | |
| "msg": "Liquibase changelog file. Flyway: export the current schema once as V1__baseline.sql in db/migration and set baselineOnMigrate for existing databases.", | |
| "source": "https://documentation.red-gate.com/fd/baseline-on-migrate-224919695.html"}, | |
| {"id": "FW10", "check": "formatted-sql-header", "sev": "warn", "kind": "regex", | |
| "re": "^\\s*--\\s*liquibase\\s+formatted\\s+sql", "flags": "i", | |
| "msg": "Liquibase formatted SQL. Flyway reads plain SQL: rename the file V\u003cn\u003e__\u003cdescription\u003e.sql and drop the --changeset lines.", | |
| "source": "https://documentation.red-gate.com/fd/migrations-184127470.html"}, | |
| {"id": "FW11", "check": "spring-liquibase-property", "sev": "warn", "kind": "regex", | |
| "re": "spring\\.liquibase\\.(?!change-log|contexts|label)|^\\s{2,}liquibase:\\s*$", "flags": "", | |
| "msg": "Spring Boot spring.liquibase.* setting. Flyway: the matching spring.flyway.* key (enabled, default-schema, user, password, url).", | |
| "source": "https://docs.spring.io/spring-boot/appendix/application-properties/index.html"}, | |
| {"id": "FW12", "check": "liquibase-extension-lpm", "sev": "warn", "kind": "regex", | |
| "re": "\\bliquibase\\s+lpm\\b|\\blpm\\s+(?:add|install)\\b|org\\.liquibase\\.ext", "flags": "i", | |
| "msg": "Liquibase extension or LPM call (5.0 ships without extensions and drivers). Flyway: add the database module instead, e.g. org.flywaydb:flyway-database-postgresql.", | |
| "source": "https://docs.liquibase.com/community/release-notes/5-0"} | |
| ] | |
| ;</script> | |
| <script>// Flyway Migration Check engine: finds Liquibase Community 5.x (FSL) ties line by line. | |
| // Same file runs in Node (VS Code extension, verify) and in the browser (free web page). | |
| (function (root) { | |
| const RULES = (typeof module !== 'undefined') ? require('./rules.json') : root.FW_RULES; | |
| const VER_RES = [ | |
| /<liquibase(?:[.-][\w]+)*[.-]version>\s*(\d+)\.(\d+)\.?(\d+)?/i, // <liquibase.version>5.0.1</liquibase.version> | |
| /org\.liquibase:liquibase-[\w-]+:\s*["']?(\d+)\.(\d+)\.?(\d+)?/, // Gradle coordinate | |
| /liquibase(?:Version|[._-]version)\s*[=:]\s*["']?(\d+)\.(\d+)\.?(\d+)?/i, // gradle.properties / ext | |
| /liquibase\/liquibase:(\d+)\.?(\d+)?\.?(\d+)?/ // Docker image tag | |
| ]; | |
| const PLAIN_VER = /<version>\s*(\d+)\.(\d+)\.?(\d+)?\s*<\/version>/; | |
| function addYears(iso, n) { return (+iso.slice(0, 4) + n) + iso.slice(4); } | |
| function asOf(opts) { | |
| const t = String((opts && opts.today) || '').slice(0, 10); | |
| return /^\d{4}-\d{2}-\d{2}$/.test(t) && !isNaN(Date.parse(t)) ? t : new Date().toISOString().slice(0, 10); | |
| } | |
| function versionAt(lines, i) { | |
| const line = lines[i]; | |
| for (const rx of VER_RES) { const m = line.match(rx); if (m) return m; } | |
| const m = line.match(PLAIN_VER); | |
| if (m && lines.slice(Math.max(0, i - 3), i).some(l => /<artifactId>\s*liquibase-/.test(l))) return m; | |
| return null; | |
| } | |
| function check(text, opts) { | |
| const lines = String(text || '').split(/\r?\n/); | |
| const today = asOf(opts); | |
| const findings = []; | |
| const verRule = RULES.find(r => r.kind === 'lbver'); | |
| const compiled = RULES.map(r => r.re ? Object.assign({ rx: new RegExp(r.re, r.flags || '') }, r) : r); | |
| // file-level Liquibase major decides how hard the artifact lines hit | |
| let fileMajor = 0, fileFsl = false; | |
| lines.forEach((l, i) => { | |
| const m = versionAt(lines, i); if (!m) return; | |
| const major = +m[1]; fileMajor = Math.max(fileMajor, major); | |
| if (major >= 5) { | |
| const v = `${m[1]}.${m[2] || 0}.${m[3] || 0}`, rel = verRule.releases[v]; | |
| if (!(rel && today >= addYears(rel, 2))) fileFsl = true; | |
| } | |
| }); | |
| lines.forEach((line, i) => { | |
| if (/^\s*(#|\/\/|<!--)/.test(line)) return; | |
| for (const r of compiled) { | |
| if (r.kind === 'lbver') { | |
| const m = versionAt(lines, i); if (!m) continue; | |
| const v = `${m[1]}.${m[2] || 0}.${m[3] || 0}`, rel = r.releases[v]; | |
| let sev = 'error', msg = r.msg; | |
| if (+m[1] < 5) { sev = 'warn'; msg = r.msg_v4; } | |
| else if (rel && today >= addYears(rel, 2)) { sev = 'info'; msg = r.msg_converted + ` (${v} released ${rel}, Apache-2.0 from ${addYears(rel, 2)})`; } | |
| else if (rel) msg += ` ${v} was released ${rel}; it turns Apache-2.0 on ${addYears(rel, 2)}.`; | |
| findings.push({ check: r.check, id: r.id, sev, msg, line: i + 1, text: line.trim() }); | |
| continue; | |
| } | |
| if (!r.rx.test(line)) continue; | |
| let sev = r.sev; | |
| if (r.kind === 'lbart') sev = fileFsl ? 'error' : 'warn'; | |
| findings.push({ check: r.check, id: r.id, sev, msg: r.msg, line: i + 1, text: line.trim() }); | |
| } | |
| }); | |
| return { | |
| findings, | |
| errors: findings.filter(f => f.sev === 'error').length, | |
| warnings: findings.filter(f => f.sev === 'warn').length, | |
| infos: findings.filter(f => f.sev === 'info').length, | |
| liquibase_major: fileMajor || null, | |
| as_of: today | |
| }; | |
| } | |
| const api = { engine: { check }, RULES, RULE_COUNT: RULES.length }; | |
| if (typeof module !== 'undefined') module.exports = api; | |
| root.FWENGINE = api; | |
| })(typeof window !== 'undefined' ? window : globalThis); | |
| </script> | |
| <script>// ⛔뼈대 — kit/scaffold.py 가 찍는다 (s143). findings [{check,sev,msg,line?}] → 글/HTML. 같은 파일이 Node 와 브라우저에서 산다. | |
| ; | |
| function escapeHtml(s) { return String(s == null ? '' : s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); } | |
| function summaryLine(res) { | |
| const f = (res && res.findings) || []; const e = f.filter(function (x) { return String(x.sev || 'error').toLowerCase().startsWith('err'); }).length; | |
| return f.length ? (f.length + ' finding' + (f.length === 1 ? '' : 's') + ' (' + e + ' error' + (e === 1 ? '' : 's') + ')') : 'Clean — no findings.'; | |
| } | |
| function toText(res, label) { | |
| const f = (res && res.findings) || []; | |
| const lines = ['== ' + (label || '') + ' — ' + summaryLine(res)]; | |
| f.forEach(function (x) { lines.push(' ' + String(x.sev || 'error').toUpperCase().slice(0, 4) + ' ' + (x.line ? 'L' + x.line + ' ' : '') + (x.check || x.id || '') + ' ' + (x.msg || x.message || '')); }); | |
| return lines.join('\n'); | |
| } | |
| function toHtml(res) { | |
| const f = (res && res.findings) || []; | |
| if (!f.length) return '<p class="ok">' + escapeHtml(summaryLine(res)) + '</p>'; | |
| const rows = f.map(function (x) { return '<tr><td class="sev ' + escapeHtml(String(x.sev || 'error')) + '">' + escapeHtml(String(x.sev || 'error')) + '</td><td>' + (x.line ? 'L' + escapeHtml(x.line) : '') + '</td><td><code>' + escapeHtml(x.check || x.id || '') + '</code></td><td>' + escapeHtml(x.msg || x.message || '') + '</td></tr>'; }).join(''); | |
| return '<p class="sum">' + escapeHtml(summaryLine(res)) + '</p><table><thead><tr><th>Level</th><th>Line</th><th>Check</th><th>What</th></tr></thead><tbody>' + rows + '</tbody></table>'; | |
| } | |
| var FWREPORT = { escapeHtml: escapeHtml, summaryLine: summaryLine, toText: toText, toHtml: toHtml }; | |
| if (typeof module !== 'undefined' && module.exports) module.exports = FWREPORT; | |
| else window.FWREPORT = FWREPORT; | |
| </script> | |
| <script> | |
| (function(){ | |
| var src=document.getElementById('src'), out=document.getElementById('out'), go=document.getElementById('go'), today=document.getElementById('today'); | |
| today.value=new Date().toISOString().slice(0,10); | |
| function run(){ try { var res=window.FWENGINE.engine.check(src.value,{today:today.value}); out.innerHTML=window.FWREPORT.toHtml(res); } catch(e){ out.innerHTML='<p class="sev error">Could not run: '+String(e.message||e)+'</p>'; } } | |
| go.onclick=run; if (src.value.trim()) run(); | |
| })(); | |
| </script> | |
| <section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://marketplace.visualstudio.com/items?itemName=ReadyStack.flyway-migration-check" rel="noopener" data-yj-install-door="mp" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'flyway-migration-check',src:'mp',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">VS Code Marketplace</a><a href="https://open-vsx.org/extension/readystack/flyway-migration-check" rel="noopener" data-yj-install-door="ovsx" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'flyway-migration-check',src:'ovsx',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Open VSX (Cursor, VSCodium)</a><pre style="margin:.5rem 0 0;padding:.6rem .8rem;background:#f3f5f8;border-radius:8px;font-size:.9rem;overflow:auto">ext install ReadyStack.flyway-migration-check</pre><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://getreadystack.com/api/buy/team" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section> | |
| <section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get one email when this rule changes</b><div style="opacity:.78;margin:.35rem 0 .8rem">We watch the regulation and vendor sources behind Flyway Migration Check — Liquibase 5 FSL ties every day. When a rule changes, you get a single email with what changed and the updated check. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Notify me</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">You're on the list. One email when it changes.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"flyway-migration-check",lang:"en",source:"rule_alert"+((b.closest&&b.closest("section")&&b.closest("section").getAttribute("data-yj-moved"))?"_at_result":"")})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script><script>(function(){var e=document.getElementById("yjae"),s=e&&e.closest?e.closest("section"):null,o=document.getElementById("out");if(!s||!o)return;var d=false;function mv(ev){if(d)return;if(ev&&ev.target&&s.contains(ev.target))return;d=true;var b=o;while(b.parentNode&&b.parentNode!==document.body&&b.parentNode.tagName!=="MAIN"&&b.parentNode.tagName!=="ARTICLE")b=b.parentNode;if(!b.parentNode||b===s||b.contains(s))return;try{b.parentNode.insertBefore(s,b.nextSibling);s.setAttribute("data-yj-moved","1");}catch(_){}}document.addEventListener("input",mv,true);document.addEventListener("change",mv,true);document.addEventListener("click",function(ev){var b=ev.target&&ev.target.closest?ev.target.closest("button,input[type=submit]"):null;if(b&&!b.closest("[data-yj],[data-yj-cta],[data-yj-install],[data-yj-alert],.yj-find,.yj-related,#yj-ask,.yjp"))mv(ev);},true);})();</script></section> | |
| <section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the full version <span class="yj-price">$29</span></h2><p class="yj-cta-paid" style="margin:.25rem 0 .6rem;color:#1f2a37">Whole-workspace Liquibase-to-Flyway migration plan; team key adds a dated licence exposure report and a CI gate</p><p class="yj-cta-pay" style="margin:.25rem 0 1rem;color:#5b6b7c;font-size:.94rem">One payment, one licence key for this tool. The key is shown right after payment.</p><p class="yj-cta-anchor" style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">Liquibase Secure, the paid Liquibase line, is sold on quote-only plans (Starter, Team, Business, Enterprise) on liquibase.com/pricing; Flyway Community is Apache-2.0 and free.</p><a href="https://getreadystack.com/api/buy/cl/polar_cl_0Kv55ZFzhN92MA1VzdjIHNeqXLBNUW0gtNzfk1niwXt" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section> | |
| <!--yj-embed-s178--><details id="embed" data-yj="yj-embed" style="max-width:46rem;margin:1.6rem auto;padding:.85rem 1.1rem;border:1px solid #8884;border-radius:10px"><summary style="cursor:pointer;font-weight:600">Embed this tool on your site (free)</summary><p style="margin:.6rem 0;opacity:.85">Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.</p><textarea readonly rows="6" style="width:100%;font:12px/1.4 ui-monospace,Menlo,Consolas,monospace;border:1px solid #8886;border-radius:7px;padding:.5rem"><iframe src="https://getreadystack.com/embed/flyway-migration-check/" title="Flyway Migration Check — Liquibase 5 FSL ties — free online check" loading="lazy" data-rs-embed="en-flyway-migration-check" style="width:100%;max-width:760px;height:640px;border:1px solid #e3e3e3;border-radius:10px"></iframe> | |
| <p style="font-size:13px;margin:6px 0 0"><a href="https://getreadystack.com/tools/flyway-migration-check">Flyway Migration Check — Liquibase 5 FSL ties — free online check</a> by <a href="https://getreadystack.com/">ReadyStack</a></p> | |
| <script>window.addEventListener("message",function(e){if(e.origin!=="https://getreadystack.com"||!e.data||e.data.type!=="readystack-embed")return;var f=document.querySelectorAll("iframe[data-rs-embed]");for(var i=0;i<f.length;i++){if(f[i].contentWindow===e.source)f[i].style.height=Math.min(e.data.h+6,8000)+"px";}});</script></textarea><p style="margin:.5rem 0 0"><button type="button" data-yj="yj-embed-copy" style="font:inherit;padding:8px 14px;border:1px solid #8884;border-radius:9px;background:transparent;cursor:pointer">Copy code</button> <a href="/embed/">All embeddable tools</a></p><p style="margin:.7rem 0 0;font-size:.92em;opacity:.9">For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. <a href="/embed/pro/?ref=embed_box">See Pro →</a></p></details><script data-yj="yj-embed">(function(){var b=document.querySelector("[data-yj=yj-embed-copy]");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var a=b.closest("details").querySelector("textarea");var v=a.value;function d(){b.textContent="Copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(v).then(d,function(){a.select();});}else{a.select();}});})();</script><!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script> | |
| <script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||''),src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}catch(e){}})();</script> | |
| <script data-yj="yj-use-beacon">(function(){try{var o=document.getElementById('out');if(!o)return;var p=location.pathname,k='yju:'+p,sent=false;function fire(){if(sent||sessionStorage.getItem(k))return;if(!(o.textContent||'').replace(/\s+/g,'').length)return;sent=true;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",t:'use',src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}var mo=new MutationObserver(function(){fire();if(sent)mo.disconnect();});mo.observe(o,{childList:true,characterData:true,subtree:true});}catch(e){}})();</script> | |
| <script data-yj="yj-prefill-s181 v1">(function(){try{var q=new URLSearchParams(location.search);if(!q.toString())return;var P={"R": {"employee": ["employee|w-?2\\b|arbeitnehmer|angestellt|会社員|従業員|給与所得|trabajador|asalariad|empregad|clt\\b|salari", "Employee"], "self": ["self-?employ|freelanc|sole (trader|prop)|selbst(ä|ae)ndig|freiberuf|個人事業|フリーランス|aut(ó|o)nom|\\bmei\\b", "Freelancer / self-employed"], "landlord": ["landlord|rental|vermiet|大家|不動産|arrendador|alquiler|locador|aluguel", "Landlord"], "investor": ["invest|trader|anleger|投資|inversor|investidor", "Investor / trader"], "employer": ["employer|arbeitgeber|雇用主|事業主|empleador|empregador", "Employer"], "seller": ["seller|online shop|h(ä|ae)ndler|販売|vendedor|e-?commerce", "Online seller"]}, "C": {"US": "^(us|usa)$|united states|estados unidos|vereinigte staaten|アメリカ|米国", "UK": "^(uk|gb)$|united kingdom|great britain|reino unido|vereinigtes k|イギリス|英国", "DE": "^de$|germany|deutschland|alemania|alemanha|ドイツ", "JP": "^jp$|japan|jap(ó|ã|o)n?|日本", "ES": "^es$|spain|españa|espana|espanha|spanien|スペイン", "BR": "^br$|brazil|brasil|ブラジル"}, "B": "your 2027 dates", "L": "en"};function ours(el){return !!(el&&el.closest&&el.closest("[data-yj],[data-yj-cta],[data-yj-cal],.yj-email-gate,.yj-find,.yj-related,#yj-ask,#yjgo,#yjr,header,footer,nav"));}function fields(){var r=document.querySelector("main")||document.body;return [].filter.call(r.querySelectorAll("input,select,textarea"),function(el){var t=(el.type||"").toLowerCase();return !ours(el)&&!el.disabled&&["email","hidden","search","password","file","submit","button","reset","image"].indexOf(t)<0;});}function key(el){return el.getAttribute("data-k")||el.id||el.name||"";}function fire(el){["input","change"].forEach(function(n){try{el.dispatchEvent(new Event(n,{bubbles:true}))}catch(e){}});}function setv(el,v){v=String(v).slice(0,80);var t=(el.type||"").toLowerCase(),tg=el.tagName;if(tg=="SELECT"){var o=[].filter.call(el.options,function(o){return o.value==v||o.text.trim()==v})[0];if(!o)return false;el.value=o.value;}else if(t=="checkbox"||t=="radio"){if(!/^(1|0|true|false|on|off|yes|no)$/i.test(v))return false;el.checked=/^(1|true|on|yes)$/i.test(v);}else if(t=="number"||t=="range"){var n=parseFloat(v.replace(/\s/g,"").replace(",","."));if(!isFinite(n))return false;el.value=String(n);}else if(t=="date"){if(!/^\d{4}-\d{2}-\d{2}$/.test(v))return false;el.value=v;}else{if(/[<>]/.test(v))return false;el.value=v;}fire(el);return true;}function pick(el,rx){if(el.tagName!="SELECT")return false;var re=new RegExp(rx,"i");var o=[].filter.call(el.options,function(o){return re.test(o.value)||re.test(o.text)})[0];if(!o||el.value==o.value)return false;el.value=o.value;fire(el);return true;}function run(){var F=fields(),done={},n=0;q.forEach(function(v,k){if(n>=20||/^(ref|role|cc|utm_.*|fbclid|gclid)$/.test(k)||!/^[A-Za-z0-9_-]{1,40}$/.test(k))return;F.forEach(function(el){if(key(el)===k&&!done[k]&&setv(el,v)){done[k]=1;n++;}});});var cc=(q.get("cc")||"").toUpperCase().replace(/[^A-Z]/g,"");if(P.C[cc])F.forEach(function(el){var k=key(el);if(!done[k]&&/country|land|pa(i|í)s|pays|国/i.test(k+" "+(el.id||""))&&pick(el,P.C[cc])){done[k]=1;n++;}});var ro=(q.get("role")||"").replace(/[^a-z]/g,""),R=P.R[ro];if(R)F.forEach(function(el){var k=key(el);if(!done[k]&&el.tagName=="SELECT"&&[].some.call(el.options,function(o){return [].some.call(Object.keys(P.R),function(x){return new RegExp(P.R[x][0],"i").test(o.text)})})&&pick(el,R[0])){done[k]=1;n++;}});if(q.get("ref")=="calendar"){var h=document.querySelector("main h1")||document.querySelector("h1");var d=document.createElement("div");d.setAttribute("data-yj","yj-prefill-back");d.style.cssText="margin:.4rem 0 .8rem;font:15px/1.5 system-ui,sans-serif;opacity:.9";var a=document.createElement("a");a.href="/"+P.L+"/calendar/?ref=tool"+(R?"&role="+ro:"")+(P.C[cc]?"&cc="+cc:"");a.textContent=(R?R[1]+" \u00b7 ":"")+P.B+" \u2192";d.appendChild(a);if(h&&h.parentNode)h.parentNode.insertBefore(d,h.nextSibling);}document.documentElement.setAttribute("data-yj-prefilled",String(n));}if(document.readyState=="loading")document.addEventListener("DOMContentLoaded",run);else run();}catch(e){}})();</script><div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&","<":"<",">":">",'"':"""}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div><section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><p style="font:400 13px/1.5 system-ui,sans-serif;color:#6b7680;margin:0 0 14px"><time datetime="2026-10-10">Updated 2026-10-10</time> · ReadyStack</p><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","dateModified":"2026-10-10","author":{"@type":"Organization","name":"ReadyStack"}}</script><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Worked example</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 16px;color:#5b6570">Real numbers from this tool, line by line.</p><div class="yj-article"><p><img src="https://getreadystack.com/img/promo/sku588693_result_card.jpg" alt="Migrate from Liquibase Community 5 to Flyway: the six pom.xml lines to change" loading="lazy" style="max-width:100%;border-radius:6px"></p> | |
| <p>Six Liquibase FSL ties turned up in a 38-line pom.xml that a Java platform engineer checked before moving a Spring Boot service from Liquibase to Flyway: three errors and three warnings, on six different lines.</p> | |
| <table><thead><tr><th>Line</th><th>Liquibase line</th><th>Flyway fix</th></tr></thead><tbody><tr><td>10</td><td><code><liquibase.version>5.0.1</liquibase.version></code></td><td><code><flyway.version>13.10.0</flyway.version></code></td></tr><tr><td>15</td><td><code><artifactId>liquibase-core</artifactId></code></td><td><code><artifactId>flyway-core</artifactId></code></td></tr><tr><td>28</td><td><code><artifactId>liquibase-maven-plugin</artifactId></code></td><td><code><artifactId>flyway-maven-plugin</artifactId></code></td></tr><tr><td>31</td><td><code><changeLogFile>db/changelog/db.changelog-master.yaml</changeLogFile></code></td><td><code><location>filesystem:src/main/resources/db/migration</location></code></td></tr><tr><td>32</td><td><code><contexts>prod</contexts></code></td><td><code>one location per environment (db/prod)</code></td></tr><tr><td>33</td><td><code><rollbackCount>1</rollbackCount></code></td><td><code>forward fix migration V<n+1>__revert.sql</code></td></tr></tbody></table> | |
| <h3>What changed and when</h3> | |
| <p>Liquibase Community 5.0.0 reached Maven Central on 2025-09-30. The 5.0 release notes say: "Liquibase Community is now licensed under the Functional Source License (FSL)." The liquibase-core POM now names its licence FSL-1.1-ALv2. The last Apache-2.0 release is 4.33.0, published 2025-07-09.</p> | |
| <p>FSL is not an OSI open-source licence. It converts each release to Apache 2.0 two years after that release is made available. So 5.0.1, published 2025-10-03, becomes Apache-2.0 on 2027-10-03, and every new 5.x release restarts the clock. For a team whose policy says "Apache-2.0 or MIT only", a single Dependabot bump from 4.33.0 to 5.0.x is enough to break the rule.</p> | |
| <h3>The three errors</h3> | |
| <p>Line 10 pins liquibase.version to 5.0.1. Lines 15 and 28 pull liquibase-core and liquibase-maven-plugin through that property. Those are the lines that put FSL code in the build. Flyway Community replaces them one for one: flyway-core plus the database module (flyway-database-postgresql for PostgreSQL), and flyway-maven-plugin. Flyway Community 13.10.0 is on Maven Central under Apache-2.0.</p> | |
| <h3>The three warnings</h3> | |
| <ul><li>changeLogFile points at a master changelog. Flyway has no master file. It reads versioned SQL files (V1__baseline.sql, V2__add_orders.sql) from the folders listed in locations.</li><li>contexts selects changesets per environment. Flyway has no per-changeset contexts. Give each environment its own folder and list it in locations.</li><li>rollbackCount relies on Liquibase rollback. Flyway undo migrations are a Teams and Enterprise feature, not part of Community. In Flyway Community you write a forward fix migration instead.</li></ul> | |
| <h3>Why a chatbot misses it</h3> | |
| <p>mvn dependency:tree prints versions, not licences. A chatbot rewrites the pom.xml you paste but does not know the cut-off is 5.0.0 or that undo is missing from Flyway Community.</p> | |
| <h3>Checking every line at once</h3> | |
| <p>Flyway Migration Check reads pom.xml, build.gradle, liquibase.properties, Spring Boot application files, Dockerfiles and changelogs against 12 rules. Each finding names the line and its Flyway replacement. The migrated pom.xml returns 0 findings.</p> | |
| <p>The check takes an as-of date. Under FSL a version is Apache-2.0 from its second anniversary, so 5.0.0 drops to info on 2027-09-30 while 5.0.4 stays an error until 2028-08-20.</p> | |
| <h3>Order of work</h3> | |
| <p>Export the schema once as V1__baseline.sql with baselineOnMigrate, swap the dependency and plugin, move contexts into per-environment locations, and replace rollback with forward fixes.</p> | |
| <p>The free check covers every rule on the open file.</p></div><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:30px 0 10px;color:#1b1f24">15 seconds — what it actually does</h2><video controls muted playsinline preload="none" poster="/img/promo/sku588693_result_card.jpg" style="width:100%;max-width:360px;border-radius:10px;display:block;margin:0 auto"><source src="/media/sku588693_short.mp4" type="video/mp4"></video><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does Flyway Migration Check do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It reads pom.xml, build.gradle, liquibase.properties, Spring Boot application files and Liquibase changelogs line by line and flags every Liquibase tie: 5.x versions under FSL-1.1-ALv2, liquibase-core and the Maven or Gradle plugin, changelog paths, contexts, rollback settings and LPM extensions. Each finding names the line and the Flyway Community line that replaces it, with the source document linked.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is Flyway Migration Check for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Java and Spring Boot teams whose legal or open-source policy accepts Apache-2.0 but not the Functional Source License, now that Liquibase Community 5.0.0 (released 2025-09-30) ships under FSL-1.1-ALv2. It suits platform engineers and tech leads who must move services from Liquibase to Flyway Community, or prove a repo no longer pulls Liquibase 5.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not just ask a chatbot or run mvn dependency:tree?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">mvn dependency:tree prints versions, not licences, and says nothing about the Flyway replacement. A chatbot rewrites the pom.xml you paste but does not know that Liquibase went FSL at 5.0.0 while 4.33.0 stayed Apache-2.0, or that Flyway undo migrations are a Teams and Enterprise feature, so a Liquibase rollback setting needs a forward fix migration in Flyway Community.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what needs a key?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Free, with no key: all 12 rules on the open file in VS Code or in the web page, every finding with its Flyway line, as often as you like. The $29 key scans the whole workspace into one Liquibase-to-Flyway migration plan. A team key adds a dated licence exposure report across projects and a CI gate that fails builds adding new Liquibase 5 use.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does the alternative cost?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Staying on Liquibase with a commercial licence means Liquibase Secure, which liquibase.com/pricing sells only on quote (Starter, Team, Business and Enterprise plans). Flyway Community is Apache-2.0 and free. Mapping a service by hand means reading every build file and changelog; the check lists the six ties in the 38-line example pom.xml at once.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">When does the Liquibase licence situation change next?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Under FSL each release turns Apache-2.0 two years after it is published. Liquibase 5.0.0 was released on 2025-09-30, so it becomes Apache-2.0 on 2027-09-30; 5.0.4 (2026-08-20) follows on 2028-08-20. Every new 5.x release restarts that two-year clock, which is why the check uses the as-of date.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does Flyway Migration Check do?", "acceptedAnswer": {"@type": "Answer", "text": "It reads pom.xml, build.gradle, liquibase.properties, Spring Boot application files and Liquibase changelogs line by line and flags every Liquibase tie: 5.x versions under FSL-1.1-ALv2, liquibase-core and the Maven or Gradle plugin, changelog paths, contexts, rollback settings and LPM extensions. Each finding names the line and the Flyway Community line that replaces it, with the source document linked."}}, {"@type": "Question", "name": "Who is Flyway Migration Check for?", "acceptedAnswer": {"@type": "Answer", "text": "Java and Spring Boot teams whose legal or open-source policy accepts Apache-2.0 but not the Functional Source License, now that Liquibase Community 5.0.0 (released 2025-09-30) ships under FSL-1.1-ALv2. It suits platform engineers and tech leads who must move services from Liquibase to Flyway Community, or prove a repo no longer pulls Liquibase 5."}}, {"@type": "Question", "name": "Why not just ask a chatbot or run mvn dependency:tree?", "acceptedAnswer": {"@type": "Answer", "text": "mvn dependency:tree prints versions, not licences, and says nothing about the Flyway replacement. A chatbot rewrites the pom.xml you paste but does not know that Liquibase went FSL at 5.0.0 while 4.33.0 stayed Apache-2.0, or that Flyway undo migrations are a Teams and Enterprise feature, so a Liquibase rollback setting needs a forward fix migration in Flyway Community."}}, {"@type": "Question", "name": "What is free and what needs a key?", "acceptedAnswer": {"@type": "Answer", "text": "Free, with no key: all 12 rules on the open file in VS Code or in the web page, every finding with its Flyway line, as often as you like. The $29 key scans the whole workspace into one Liquibase-to-Flyway migration plan. A team key adds a dated licence exposure report across projects and a CI gate that fails builds adding new Liquibase 5 use."}}, {"@type": "Question", "name": "What does the alternative cost?", "acceptedAnswer": {"@type": "Answer", "text": "Staying on Liquibase with a commercial licence means Liquibase Secure, which liquibase.com/pricing sells only on quote (Starter, Team, Business and Enterprise plans). Flyway Community is Apache-2.0 and free. Mapping a service by hand means reading every build file and changelog; the check lists the six ties in the 38-line example pom.xml at once."}}, {"@type": "Question", "name": "When does the Liquibase licence situation change next?", "acceptedAnswer": {"@type": "Answer", "text": "Under FSL each release turns Apache-2.0 two years after it is published. Liquibase 5.0.0 was released on 2025-09-30, so it becomes Apache-2.0 on 2027-09-30; 5.0.4 (2026-08-20) follows on 2028-08-20. Every new 5.x release restarts that two-year clock, which is why the check uses the as-of date."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:588693,slug:"flyway-migration-check",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/maven-central-publish-gate?ref=related"><span class="yj-rel-t">Maven Central Publish Gate</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/flit-migration-check?ref=related"><span class="yj-rel-t">Flit Migration Check: setup.py to flit_core 4</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/podman-migration-check?ref=related"><span class="yj-rel-t">Podman Migration Check — Docker Desktop ties</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/valkey-migration-check?ref=related"><span class="yj-rel-t">Valkey Migration Check — ElastiCache Redis ties</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/skills/yolo-agpl-license-check/?ref=related"><span class="yj-rel-t">YOLO AGPL license skill for Claude Code — Ultralytics ties by line, RF-DETR fi</span><span class="yj-rel-p">$12</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/rf-detr-migration-check?ref=related"><span class="yj-rel-t">rf-detr Migration Check — Ultralytics YOLO ties</span><span class="yj-rel-p">$29</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section></body> | |
| </html> | |