在多模块Maven项目中与Liquibase一起使用@ project.version @

问题描述 投票:1回答:1

想出一个有意义的标题有些困难,希望它在解释后变得足够清楚。我在SO上搜索了许多问与答,它们都非常接近我所遇到的问题,但还不够接近。

[通常,我想通过从Liquibase脚本加载的@project.version@文件访问Maven属性.csv将项目版本存储在DB中。我的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@。在我看来,我应该使用parentModule pom.xml将app_version.csv及其位置(moduleC)作为资源包含在<build>标记内,但是引用它的每种组合都会失败。是否有一种解决方案可以正确地引用它(从parentModule或moduleC pom.xml),或者可能有一种更简单的方法来用liquibase存储@project.version@

java maven liquibase
1个回答
0
投票

好像您在CSV文件中过滤时使用了错误的语法。代替使用@project.version@,请尝试使用${project.version}

id;app_key;app_value;created_by;last_modified_by
1;app-version;${project.version};system;system

请参见https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

我已经在一个带有CSV的小型示例项目中尝试了上述方法,在target文件夹中,过滤后将项目版本注入到CSV文件中。您可能希望将“过滤”的文件集保持最少,因为${的任何出现都需要像这样进行转义:\${

© www.soinside.com 2019 - 2024. All rights reserved.