flowable/flowable-engine · error · ActivitiException

Illegal format for version

Error message

Illegal format for version: <versionString>

What it means

getCleanVersion extracts the numeric portion of a version string read from the database schema version table. If the string does not match CLEAN_VERSION_REGEX, Flowable cannot determine the schema version and throws this ActivitiException. It guards schema upgrade logic against unparseable version values.

Solutions

  1. Query the schema version table and fix the VERSION value to a plain numeric string (e.g. '6.7.2')
  2. If the table belongs to another product's schema, point the engine at the correct database/schema
  3. If the schema is in an unknown state, drop and recreate it via databaseSchemaUpdate=true on a clean database
  4. Compare the stored version against your engine version to detect a version mismatch

Example fix

// before
UPDATE ACT_GE_PROPERTY SET VALUE_ = 'v6' WHERE NAME_ = 'schema.version';
// after
UPDATE ACT_GE_PROPERTY SET VALUE_ = '6.7.2' WHERE NAME_ = 'schema.version';
Defensive patterns

Strategy: validation

Validate before calling

String v = jdbcTemplate.queryForObject(
  "SELECT VALUE_ FROM ACT_GE_PROPERTY WHERE NAME_='schema.version'", String.class);
if (v == null || !v.matches("\\d+(\.\\d+)*")) {
  throw new IllegalStateException("Unparseable schema version in DB: " + v);
}

Prevention

When it happens

Trigger: Schema version lookup (e.g. table ACT_GE_PROPERTY / FLW_EV_DATABASECHANGELOG) returns a version string that does not match the expected numeric pattern, e.g. '5.x', empty string, or arbitrary text in the VERSION column.

Common situations: Manually edited version rows in the property table, schemas created by a different/incompatible engine, or corrupted/migrated databases left with non-numeric version values.

Understand the failure class

Background: "invalid id" errors: invalid identifier format — why libraries reject IDs before lookup, and how to fix them — this error's family across 37 libraries.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/8a8682a357d38922. Report an issue: GitHub.

Appendix: source

Thrown at modules/flowable5-engine/src/main/java/org/activiti/engine/impl/db/DbSqlSession.java:1031

                tables = databaseMetaData.getTables(catalog, schema, tableName, JDBC_METADATA_TABLE_TYPES);
                return tables.next();
            } finally {
                try {
                    tables.close();
                } catch (Exception e) {
                    LOGGER.error("Error closing meta data tables", e);
                }
            }

        } catch (Exception e) {
            throw new ActivitiException("couldn't check if tables are already present using metadata: " + e.getMessage(), e);
        }
    }

    protected String getCleanVersion(String versionString) {
        Matcher matcher = CLEAN_VERSION_REGEX.matcher(versionString);
        if (!matcher.find()) {
            throw new ActivitiException("Illegal format for version: " + versionString);
        }

        String cleanString = matcher.group();
        try {
            Double.parseDouble(cleanString); // try to parse it, to see if it is really a number
            return cleanString;
        } catch (NumberFormatException nfe) {
            throw new ActivitiException("Illegal format for version: " + versionString, nfe);
        }
    }

    protected String prependDatabaseTablePrefix(String tableName) {
        return dbSqlSessionFactory.getDatabaseTablePrefix() + tableName;
    }

    protected String readNextTrimmedLine(BufferedReader reader) throws IOException {
        String line = reader.readLine();
        if (line != null) {

View on GitHub (pinned to d6d39ce1c6)