Правильная позиция управления номерами версий в многомодульной структуре Maven.

Java
Правильная позиция управления номерами версий в многомодульной структуре Maven.

Я не знаю, делали ли вы когда-нибудь проект maven, который нужно опубликовать на удаленном складе, или он состоит из нескольких модулей.Каждый модуль может существовать независимо и имеет свой номер версии. Как и в Spring Boot, хотя такие модули, как jdbc/web/redis, представляют собой несколько модулей в рамках одного проекта, после выпуска они становятся независимыми артефактами. Если номер версии жестко закодирован, он не подходит для обслуживания, а ссылочный номер версии будет иметь проблемы, такие как наследование. Итак, вопрос в том, как поддерживать глобальный номер версии?

При использовании проекта многомодульной структуры Maven настройка номера версии является головной болью. Унаследованная версия, зависимая версия и собственная версия должны определяться отдельно, что очень проблематично. Но на самом деле Maven уже предоставил этот метод управления версиями CI, и конкретное использование будет представлено ниже.

отMaven 3.5.0-beta-1версия, вы можете использовать${revision}, ${sha1}а также${changelist}В качестве заполнителя для замены файла pom.

Примечание. Используйте в более низкой версии Idea.${revision}При определении родительской версии будет выдаваться ошибка "Сообщает, что использование свойств в родительском определении модулей запрещено", но это не влияет на использование, но Idea не поддерживает такой способ записи.

одномодульный проект

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
</project>

Этот случай проще, просто используйте${revision}для замены версии.

Также есть еще один способ динамического добавления параметров для указания версии

mvn -Drevision=1.0.0-SNAPSHOT clean package

-D означает установку переменных среды

-D,--define <arg> Define a system property

Или укажите версию в свойствах (родительского) проекта:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>
</project>

многомодульный проект

Теперь давайте рассмотрим случай многомодульных сборок. Имеется родительский проект и один или несколько подмодулей. Родительский помпон будет выглядеть так:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>
  <modules>
    <module>child1</module>
    ..
  </modules>
</project>

Конфигурация подмодуля:

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.maven.ci</groupId>
    <artifactId>ci-parent</artifactId>
    <version>${revision}</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-child</artifactId>
   ...
</project>

Версия подмодуля в многомодульном проекте должна использовать версию родительского проекта. Установка версии отдельно приведет к путанице версий.

полагаться

В многомодульной структуре проекта будет много зависимостей модулей.Вы должны использовать ${project.version}, чтобы определить версию зависимости (зависимость в рамках одного и того же родительского проекта).

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>
  <modules>
    <module>child1</module>
    ..
  </modules>
</project>

Конфигурация подпроекта:

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.maven.ci</groupId>
    <artifactId>ci-parent</artifactId>
    <version>${revision}</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-child</artifactId>
   ...
  <dependencies>
		<dependency>
      <groupId>org.apache.maven.ci</groupId>
      <artifactId>child2</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</project>

install/deploy

Если вы публикуете с указанными выше настройками, вы должны использоватьflatten-maven-plugin

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>18</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>

 <build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>flatten-maven-plugin</artifactId>
      <version>1.1.0</version>
      <configuration>
          <!--是否更新pom文件,记得设置为true,不然无法更新module里的pom版本号-->
          <!--此处还有更高级的用法,具体下方的参考文档-->
        <updatePomFile>true</updatePomFile>
        <flattenMode>resolveCiFriendliesOnly</flattenMode>
      </configuration>
      <executions>
        <execution>
          <id>flatten</id>
          <phase>process-resources</phase>
          <goals>
            <goal>flatten</goal>
          </goals>
        </execution>
        <execution>
          <id>flatten.clean</id>
          <phase>clean</phase>
          <goals>
            <goal>clean</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
  </build>
  <modules>
    <module>child1</module>
    ..
  </modules>
</project>

После окончательного выполнения установки/развертывания maven будет использовать файл pom модуля в${revision}Замените фактический номер версии, чтобы легко решить проблему номера версии в pom

Ссылаться на

Оригинальность не так проста, пожалуйста, свяжитесь с автором для перепечатки. Если моя статья полезна для вас, пожалуйста, поставьте лайк/добавьте в избранное/подпишитесь, чтобы поддержать и поддержать ее ❤❤❤❤❤❤