在多模块 Maven 项目中将 @project.version@ 与 Liquibase 一起使用
Using @project.version@ with Liquibase in a multimodule Maven project
有点难想出一个有意义的标题,希望解释后能清楚一点。我在 SO 上搜索了一些 Qs 和 As,它们都非常接近我遇到的问题,但仍然不够接近。
一般来说,我想要完成的是通过从 Liquibase 脚本加载的 .csv
文件访问 Maven 属性 @project.version@
来将项目版本存储在数据库中。
我的 Maven 项目结构如下所示:
parentModule
pom.xml
|
---moduleA
|__pom.xml
---moduleB
|__pom.xml
---moduleC
|__pom.xml
...
Pom.xml 定义为:
**PARENT POM**
<project ...>
<groupId>com.parent</groupId>
<artifactId>parent</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<name>parent</name>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.2.1.RELEASE</version>
<relativePath />
</parent>
<properties>
<java.version>8</java.version>
</properties>
<modules>
<module>moduleA</module>
<module>moduleB</module>
<module>moduleC</module>
...
</modules>
<build>
<defaultGoal>package</defaultGoal>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
----------------------------------------------------------------------
**CHILD POM**
<project ...>
<artifactId>moduleC</artifactId>
<name>moduleC</name>
<parent>
<groupId>com.parent</groupId>
<artifactId>parent</artifactId>
<version>1.0</version>
</parent>
<dependencies>
<dependency>
...
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>moduleC/src/main/resources/db/changelog/</directory>
<filtering>true</filtering>
<includes>
<include>**/app_version.csv/</include>
</includes>
</resource>
</resources>
</build>
</project>
Liquibase 脚本在 moduleC/src/main/resources/db/changelog/changelog-master.xml
等中定义,而具有初始值的 .csv 文件位于 moduleC/src/main/resources/db/users.csv
等中。在其中一个 csv 文件中,我想推送 @project.version@
值,像这样:
id;app_key;app_value;created_by;last_modified_by
1;app-version;@project.version@;system;system
由于该文件位于 moduleC
,我什至在 parentModule
<build/>
中使用了 maven 资源过滤来过滤该文件,以便它可以解析 @project.version@
属性,但没有运气:
<build>
<resources>
<resource>
<directory>moduleC/src/main/resources/db/changelog/</directory>
<filtering>true</filtering>
<includes>
<include>**/app_version.csv/</include>
</includes>
</resource>
</resources>
<defaultGoal>package</defaultGoal>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
有错误,一个说找不到主更新日志,而在其他情况下只存储字符串值 @project.version@
。在我看来,我应该将 app_version.csv
及其位置 (moduleC
) 作为资源包含在带有 parentModule pom.xml 的 <build>
标记内,但引用它的每个组合都会失败。是否有正确引用它的解决方案(从 parentModule 或 moduleC pom.xml)或者可能有更简单的方法来存储 @project.version@
with liquibase?
您似乎在 CSV 文件中使用了错误的过滤语法。不要使用 @project.version@
,而是尝试使用 ${project.version}
:
检查 <directory>moduleC/src/main/resources/...</directory>
,如果资源插件位于 moduleC 的子 POM 中,则不需要前缀。
尝试替换为 <directory>src/main/resources/..</directory>
我认为您需要在构建周期中使用 maven-replacer-plugin。它将被配置为处理 'app_version.csv' 文件并将替换的文件内容输出到 'target/classes' 文件夹。随后的打包阶段将确保将具有当前 pom 版本的 csv 文件捆绑到 liquidbase 工具随后处理的工件中。
模块的资源过滤应该在模块本身的构建中。
project.version 属性 将从父级继承。
请小心过滤,以免弄乱您的 xml 文件。
我认为语法应该是 ${project.version}
你能分享一下你的 liquibase maven 插件配置吗?
标记应指向您的主更改日志。
这是另外两个解决方案:
另一种解决方案是在每次创建新版本时创建一个 liquibase 变更集。您可以在 spring 组件中使用 liquibase java SDK 以编程方式执行此操作,该组件 运行 在您的项目启动时或您自己创建变更集。
另一个解决方案是使用 Spring Boot Actuator 来检索项目版本。
为此,您需要在 spring-boot-maven-plugin
的目标中添加 <goal>build-info</goal>
非常抱歉没有及时回复,在发布问题后暂时从项目中删除,并且由于位置更改无法访问 git 存储库。到目前为止,我已经尝试了所有建议的操作,但没有结果。最后,我发现有用的是发布 here 的已接受答案。我在 mavenC 模块 pom.xml 中添加了构建块并且它有效。不过,非常感谢大家的发帖和帮助。
有点难想出一个有意义的标题,希望解释后能清楚一点。我在 SO 上搜索了一些 Qs 和 As,它们都非常接近我遇到的问题,但仍然不够接近。
一般来说,我想要完成的是通过从 Liquibase 脚本加载的 .csv
文件访问 Maven 属性 @project.version@
来将项目版本存储在数据库中。
我的 Maven 项目结构如下所示:
parentModule
pom.xml
|
---moduleA
|__pom.xml
---moduleB
|__pom.xml
---moduleC
|__pom.xml
...
Pom.xml 定义为:
**PARENT POM**
<project ...>
<groupId>com.parent</groupId>
<artifactId>parent</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<name>parent</name>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.2.1.RELEASE</version>
<relativePath />
</parent>
<properties>
<java.version>8</java.version>
</properties>
<modules>
<module>moduleA</module>
<module>moduleB</module>
<module>moduleC</module>
...
</modules>
<build>
<defaultGoal>package</defaultGoal>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
----------------------------------------------------------------------
**CHILD POM**
<project ...>
<artifactId>moduleC</artifactId>
<name>moduleC</name>
<parent>
<groupId>com.parent</groupId>
<artifactId>parent</artifactId>
<version>1.0</version>
</parent>
<dependencies>
<dependency>
...
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>moduleC/src/main/resources/db/changelog/</directory>
<filtering>true</filtering>
<includes>
<include>**/app_version.csv/</include>
</includes>
</resource>
</resources>
</build>
</project>
Liquibase 脚本在 moduleC/src/main/resources/db/changelog/changelog-master.xml
等中定义,而具有初始值的 .csv 文件位于 moduleC/src/main/resources/db/users.csv
等中。在其中一个 csv 文件中,我想推送 @project.version@
值,像这样:
id;app_key;app_value;created_by;last_modified_by
1;app-version;@project.version@;system;system
由于该文件位于 moduleC
,我什至在 parentModule
<build/>
中使用了 maven 资源过滤来过滤该文件,以便它可以解析 @project.version@
属性,但没有运气:
<build>
<resources>
<resource>
<directory>moduleC/src/main/resources/db/changelog/</directory>
<filtering>true</filtering>
<includes>
<include>**/app_version.csv/</include>
</includes>
</resource>
</resources>
<defaultGoal>package</defaultGoal>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
有错误,一个说找不到主更新日志,而在其他情况下只存储字符串值 @project.version@
。在我看来,我应该将 app_version.csv
及其位置 (moduleC
) 作为资源包含在带有 parentModule pom.xml 的 <build>
标记内,但引用它的每个组合都会失败。是否有正确引用它的解决方案(从 parentModule 或 moduleC pom.xml)或者可能有更简单的方法来存储 @project.version@
with liquibase?
您似乎在 CSV 文件中使用了错误的过滤语法。不要使用 @project.version@
,而是尝试使用 ${project.version}
:
检查 <directory>moduleC/src/main/resources/...</directory>
,如果资源插件位于 moduleC 的子 POM 中,则不需要前缀。
尝试替换为 <directory>src/main/resources/..</directory>
我认为您需要在构建周期中使用 maven-replacer-plugin。它将被配置为处理 'app_version.csv' 文件并将替换的文件内容输出到 'target/classes' 文件夹。随后的打包阶段将确保将具有当前 pom 版本的 csv 文件捆绑到 liquidbase 工具随后处理的工件中。
模块的资源过滤应该在模块本身的构建中。 project.version 属性 将从父级继承。 请小心过滤,以免弄乱您的 xml 文件。 我认为语法应该是 ${project.version}
你能分享一下你的 liquibase maven 插件配置吗? 标记应指向您的主更改日志。
这是另外两个解决方案: 另一种解决方案是在每次创建新版本时创建一个 liquibase 变更集。您可以在 spring 组件中使用 liquibase java SDK 以编程方式执行此操作,该组件 运行 在您的项目启动时或您自己创建变更集。
另一个解决方案是使用 Spring Boot Actuator 来检索项目版本。 为此,您需要在 spring-boot-maven-plugin
的目标中添加<goal>build-info</goal>
非常抱歉没有及时回复,在发布问题后暂时从项目中删除,并且由于位置更改无法访问 git 存储库。到目前为止,我已经尝试了所有建议的操作,但没有结果。最后,我发现有用的是发布 here 的已接受答案。我在 mavenC 模块 pom.xml 中添加了构建块并且它有效。不过,非常感谢大家的发帖和帮助。