想出一个有意义的标题有些困难,希望它在解释后变得足够清楚。我在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@
?
好像您在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文件中。您可能希望将“过滤”的文件集保持最少,因为${
的任何出现都需要像这样进行转义:\${