Spring应用中Liquibase Changelog执行报错:changelog-uris must be even
解决Liquibase执行报错‘changelog-uris must be even’的问题
嘿,这个报错看起来有点迷惑,但根源其实很简单——你的changelog XML代码没写完,存在语法不完整的问题!
你提供的代码最后一行是:
<column name="plattform_id" ty
这里明显截断了,<column>标签既没写完type属性,也没有闭合,这种不完整的XML会让Liquibase的解析器彻底混乱,进而抛出看似不相关的changelog-uris must be even错误。
修复步骤
- 补全最后那个残缺的
<column>标签,参考你前面的表结构,应该是要定义type="int"并添加对应的外键约束; - 确保整个XML文件的所有标签都正确闭合,没有任何语法遗漏。
修复后的完整示例代码
<?xml version="1.0" encoding="utf-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <changeSet id="1" author="tobias"> <createTable tableName="Entwickler"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="name" type="varchar(50)"/> <column name="webseite" type="varchar(50)"/> <column name="gruendungsdatum" type="BIGINT"/> </createTable> <createTable tableName="Publisher"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="name" type="varchar(50)"/> <column name="webseite" type="varchar(50)"/> <column name="gruendungsdatum" type="BIGINT"/> </createTable> <createTable tableName="Spiel"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="name" type="varchar(50)"/> <column name="publisher_id" type="int"> <constraints nullable="false" foreignKeyName="fk_publisher" references="Publisher(id)"/> </column> </createTable> <createTable tableName="Bilder"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="name" type="varchar(50)"/> <column name="picture_kind" type="varchar(50)"/> <column name="game_id" type="int"> <constraints nullable="false" foreignKeyName="fk_game" references="Spiel(id)"/> </column> </createTable> <createTable tableName="Spiel_Entwickler"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="entwickler_id" type="int"> <constraints nullable="false" foreignKeyName="fk_Entwickler" references="Entwickler(id)"/> </column> <column name="game_id" type="int"> <constraints nullable="false" foreignKeyName="fk_Game" references="Spiel(id)"/> </column> </createTable> <createTable tableName="Language"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="Language" type="varchar(50)"/> </createTable> <createTable tableName="plattform"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="plattform" type="varchar(50)"/> </createTable> <createTable tableName="Redaktion"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="Redaktion" type="varchar(50)"/> </createTable> <createTable tableName="Language_Spiel"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="name" type="varchar(50)"/> <column name="spiel_id" type="int"> <constraints nullable="false" foreignKeyName="fk_spiel" references="Spiel(id)"/> </column> <column name="language_id" type="int"> <constraints nullable="false" foreignKeyName="fk_language" references="Language(id)"/> </column> <column name="Youtube" type="varchar(50)"/> <column name="Beschreibung" type="varchar(50)"/> <column name="Altersfreigabe" type="int"/> </createTable> <createTable tableName="spiel_plattform"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="name" type="varchar(50)"/> <column name="spiel_id" type="int"> <constraints nullable="false" foreignKeyName="fk_spiel" references="Language_Spiel(id)"/> </column> <column name="plattform_id" type="int"> <constraints nullable="false" foreignKeyName="fk_plattform" references="plattform(id)"/> </column> <column name="releasedate" type="bigint"/> <column name="releasedate_kind" type="varchar(50)"/> <column name="shop" type="varchar(50)"/> </createTable> <createTable tableName="Rating"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="redaktion_id" type="int"> <constraints nullable="false" foreignKeyName="fk_Rating" references="Redaktion(id)"/> </column> <column name="plattform_id" type="int"> <constraints nullable="false" foreignKeyName="fk_plattform_rating" references="plattform(id)"/> </column> </createTable> </changeSet> </databaseChangeLog>
验证方法
- 先用IDE自带的XML校验功能检查文件语法是否完整;
- 重新执行Maven Liquibase命令(比如
mvn liquibase:update),应该就能正常运行了。
内容的提问来源于stack exchange,提问作者gigashark
相关产品推荐
相关产品推荐

