在多模块 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 中添加了构建块并且它有效。不过,非常感谢大家的发帖和帮助。