Использование @ project.version @ с Liquibase в многомодульном проекте Maven - PullRequest
6 голосов
/ 10 января 2020

Было немного сложно придумать осмысленное название, надеюсь, оно станет достаточно ясным после объяснения. Я просмотрел несколько Qs и As на SO, и все они были очень близки к проблеме, с которой я сталкиваюсь, но все еще не достаточно близко. сохранить версию проекта в БД, обратившись к свойству maven @project.version@ из файла .csv, который загружается скриптом Liquibase. Моя структура проекта 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 et c., Тогда как CSV-файлы с начальными значениями находятся в moduleC/src/main/resources/db/users.csv et c. В одном из этих CSV-файлов я хочу указать значение pu sh @project.version@, например:

id;app_key;app_value;created_by;last_modified_by
1;app-version;@project.version@;system;system

Поскольку этот файл находится в moduleC, я использовал фильтрацию ресурсов maven даже в parentModule <build/> чтобы отфильтровать этот файл, чтобы он мог разрешить свойство @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) в качестве ресурса внутри тега <build> с parentModule pom. xml, но каждая комбинация ссылок на него терпит неудачу. Есть ли решение для правильной ссылки на него (либо из parentModule, либо из модуля C pom. xml), либо может быть более простой способ хранения @project.version@ с жидкой базой?

Ответы [ 4 ]

2 голосов
/ 19 января 2020

Мне очень жаль, что я не ответил вовремя, был временно удален из проекта после публикации вопроса и не смог получить доступ к репозиторию git из-за изменения местоположения. Пока что я перепробовал все предложенные действия, но безрезультатно. В конце концов, то, что я нашел для работы, было принятым ответом, опубликованным здесь . Я добавил блок сборки внутри модуля maven C pom. xml, и это сработало. Тем не менее, огромное спасибо всем за публикацию и помощь.

1 голос
/ 16 января 2020

Я думаю, вам нужно использовать maven-replacer-plugin в вашем цикле сборки. Он будет настроен на обработку файла 'app_version.csv' и вывод содержимого замещенного файла в папку 'target / classes'. На последующем этапе упаковки файл csv с текущей версией pom будет связан с артефактом, который затем обрабатывает инструмент на жидкой основе.

1 голос
/ 17 января 2020

Фильтрация ресурсов модуля должна быть в сборке самого модуля. Свойство project.version будет унаследовано от родителя. Будьте осторожны, чтобы фильтрация не мешала вашим xml файлам. Я думаю, что синтаксис должен быть $ {project.version}

Можете ли вы поделиться своей конфигурацией плагина liquibase maven? Разметка должна указывать на ваш основной журнал изменений.

Вот два других решения: Другое решение - создание набора изменений в жидкой базе каждый раз, когда вы создаете новую версию. Вы можете сделать это программно, используя liquibase java SDK в компоненте Spring, который запускается при запуске вашего проекта или самостоятельно создавать набор изменений.

Другим решением будет использование Spring Boot Actuator для получения версии проекта. Для этого вам нужно добавить <goal>build-info</goal> в целях spring-boot-maven-plugin

1 голос
/ 15 января 2020

Похоже, вы используете неправильный синтаксис для фильтрации в CSV-файле. Вместо использования @project.version@, попробуйте ${project.version} вместо:

Проверьте <directory>moduleC/src/main/resources/...</directory>, если плагин ресурсов находится в дочернем POM модуля C, префикс не требуется .

Попробуйте заменить на <directory>src/main/resources/..</directory>

...