Рубрики
Без рубрики

Конфигурация Плагина Maven – (Неизвестные) Мелкие Детали

Обзор Если вы используете Apache Maven, я полагаю, вы настроили несколько плагинов внутри… С тегом maven, maven plugin, configuration, java.

Если вы используете Apache Maven Я полагаю, вы уже настроили несколько плагинов в своем pom-файле. В качестве примера мы используем плагин Maven Enforcer , чтобы предотвратить запуск данной сборки с версией Maven, которая меньше 3.5.0, которая выглядит следующим образом:


  
    
      
        org.apache.maven.plugins
        maven-enforcer-plugin
        3.0.0-M3
        
          
            id-enforce
            
              enforce
            
            
              
                
                  3.5.0
                
              
            
          
        
      
    
  

Теперь вы вызываете Maven следующим образом: mvn enforcer:enforce но теперь вы удивлены неудачей, с которой столкнетесь (для краткости вставил некоторые разрывы строк в выходные данные):

$ mvn enforcer:enforce 
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------< com.soebes.articles.plugins:configuration >--------------
[INFO] Building configuration 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ configuration ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.363 s
[INFO] Finished at: 2021-03-22T20:01:53+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce (default-cli)
on project configuration: No rules are configured. Use the skip flag if you want to disable execution. -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Похоже, что конфигурация, которую мы привели в примере, не учитывается. Что я должен сказать. Да, в этом-то все и дело. Теперь главный вопрос: почему?

Подробности

Давайте подробнее рассмотрим, почему это происходит. Причина в том, что при вызове Maven через mvn enforcer:enforce вы не запустили жизненный цикл (что-то вроде clean , package или что-то подобное). Вы просили выполнить поставленную цель обеспечить соблюдение из |/Плагин Maven Enforcer .

Это означает, что в конечном итоге существует разница в настройке плагинов между вызовом жизненного цикла и цели .

Как мы можем проверить, что то, что я утверждал, верно? Это легко сделать, просто вызвав фазу жизненного цикла/| как инициализировать (вы также можете использовать verify или |/package вместо инициализировать только бег занимает больше времени.):

$ mvn initialize 
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------< com.soebes.articles.plugins:configuration >--------------
[INFO] Building configuration 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (id-enforce) @ configuration ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.355 s
[INFO] Finished at: 2021-03-22T20:02:40+01:00
[INFO] ------------------------------------------------------------------------

Итак, первая миссия выполнена и доказано, что ранее заданная конфигурация теперь учитывается.

Итак, основываясь на этих выводах, можем ли мы каким-то образом создать конфигурацию, которая учитывается при вызове цели enforcer:enforce ? Да, есть способ сделать это с помощью следующей конфигурации:


  
    
      
        org.apache.maven.plugins
        maven-enforcer-plugin
        3.0.0-M3
        
          
            default-cli
            
              enforce
            
            
              
                
                  3.5.0
                
              
            
          
        
      
    
  

Теперь мы называем цель:

$ mvn enforcer:enforce 
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------< com.soebes.articles.plugins:configuration >--------------
[INFO] Building configuration 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ configuration ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.516 s
[INFO] Finished at: 2021-03-22T20:29:34+01:00
[INFO] ------------------------------------------------------------------------

Вы также можете вызвать жизненный цикл следующим образом:

$ mvn initialize 
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------< com.soebes.articles.plugins:configuration >--------------
[INFO] Building configuration 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ configuration ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.498 s
[INFO] Finished at: 2021-03-27T16:18:03+01:00
[INFO] ------------------------------------------------------------------------

Вы заметили разницу? Единственная разница была между id-enforcement (из первого примера конфигурации) и default-cli во втором случае. Имя default-cli , как следует из названия, используется по умолчанию для выполнения командной строки. Это означает, что вы можете определить конфигурацию/выполнение, которые используются только для вызова целей из командной строки и не являются частью жизненного цикла .

На следующем шаге мы хотели бы создать конфигурации, в которых один из них применяется для выполнения командной строки default-cli и еще один для выполнения жизненного цикла другой-id .


  
    
      
        org.apache.maven.plugins
        maven-enforcer-plugin
        3.0.0-M3
        
          
            default-cli
            
              enforce
            
            
              
                
                  25
                
              
            
          
          
            another-id
            
              enforce
            
            
              
                
                  3.9.0
                
              
            
          
        
      
    
  

Приведенная выше конфигурация требует, чтобы для сборки использовалась версия JDK 25 вместо той, которую я использую в настоящее время (только для демонстрационных целей; Хорошо, возможно, немного в будущем). Вторая конфигурация проверяет версию Maven, которая, как ожидается, будет использоваться для этой сборки. Итак, давайте сначала назовем цель:

$ mvn enforcer:enforce 
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------< com.soebes.articles.plugins:configuration >--------------
[INFO] Building configuration 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ configuration ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireJavaVersion failed with message:
Detected JDK Version: 11.0.9 is not in the allowed range 25.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.549 s
[INFO] Finished at: 2021-03-22T20:45:27+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce (default-cli)
 on project configuration: Some Enforcer rules have failed. Look above for specific messages explaining 
 why the rule failed. -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Вы можете видеть, что в командной строке учитывается только конфигурация, которую можно определить по сообщению Обнаружена версия JDK: 11.0.9 не находится в допустимом диапазоне 25. . Так что сработало, как и ожидалось. Теперь мы пытаемся выполнить в рамках жизненного цикла:

$ mvn initialize 
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------< com.soebes.articles.plugins:configuration >--------------
[INFO] Building configuration 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ configuration ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireJavaVersion failed with message:
Detected JDK Version: 11.0.9 is not in the allowed range 25.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.450 s
[INFO] Finished at: 2021-03-27T16:40:31+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) 
on project configuration: Some Enforcer rules have failed. Look above for specific messages explaining 
why the rule failed. -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Этого никто не ожидал? Этого никто не ожидал? Этого никто не ожидал? цель, которая имеет привязку по умолчанию к жизненному циклу , которую можно определить, прочитав документ плагина (отрывок из него):

enforcer:enforce
Full name:
  org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce

Description:
  This goal executes the defined enforcer-rules once per module.
  Attributes:

* Requires a Maven project to be executed.
* Binds by default to the lifecycle phase: validate.

Важная часть – это последняя строка: Привязывается по умолчанию к фазе жизненного цикла: проверка. . Это описывает поведение, которое мы можем наблюдать здесь. Мы используем цель принудительное применение просто определяя/| цель . Если вы привязываете плагин следующим образом:


.....
        
          
            default-cli
            
              enforce
            
            
              
                
                  25
                
              
            
          
          
            another-id
            
              enforce
            
            
              
                
                  3.9.0
                
              
            
          
        
  ...

Это подразумевает, что фаза жизненного цикла, к которой привязан плагин, выполняется самим плагином. Это означает, что в конечном итоге окончательная конфигурация выглядит следующим образом:


.....
        
          
            default-cli
            
              enforce
            
            initialize
            
              
                
                  25
                
              
            
          
          
            another-id
            
              enforce
            
            initialize
            
              
                
                  3.9.0
                
              
            
          
        
  ...

Это означает, что при вызове жизненного цикла mvn initialize будут выполнены оба выполнения, и в конце также будет выполнено первое (для версии java), даже если указать default-cli .

Привязка к Жизненному циклу

В тех случаях, когда вы хотите уточнить, к какой фазе жизненного цикла привязан плагин, просто запишите его в конфигурацию. Это позволяет переопределять значения по умолчанию, которые определил плагин (лучше автор (ы) плагина). Мы можем использовать эту информацию для решения нашей проблемы, изменив конфигурацию с помощью следующего подхода: мы просто отделяем принудительное выполнение цели для одного выполнения от жизненного цикла путем определения жизненного цикла фазы ( НЕИЗВЕСТНО ), которая просто не существуют.


  
    
      
        org.apache.maven.plugins
        maven-enforcer-plugin
        3.0.0-M3
        
          
            default-cli
            
              enforce
            
            UNKNOWN
            
              
                
                  25
                
              
            
          
          
            another-id
            
              enforce
            
            
              
                
                  3.9.0
                
              
            
          
        
      
    
  

Другая конфигурация another-id может быть сохранена без изменений. Эта (предполагаемая) связь могла быть идентифицирована в более ранних выходных данных, где была распечатана строка:

$ mvn initialize
...
[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ configuration ---
..

Это указывает на то, что цель принудительное применение плагина привязана к жизненному циклу по умолчанию инициализировать самим плагином в противоречии с выводом (по умолчанию -cli) (что может привести нас на ложный путь).

Это явный признак того, что данная цель ( enforce ) не предназначена для вызова из командной строки. Обычно я рекомендую не пытаться настраивать/выполнять цели в командной строке, пока в документах показано: Привязывается по умолчанию к фазе жизненного цикла: .. . Скорее всего, есть исключения, но в целом не пробуйте это, иначе вы перейдете на темную сторону силы 😉

Есть также примеры, такие как Плагин сборки Maven , который имеет ровно одну цель single , которая вообще не привязана к фазе жизненного цикла. Это не означает, что вы должны использовать single goal через командную строку (технически вы можете) но обычно это не имеет смысла. Как правило, имеет смысл привязать single цель к фазе жизненного цикла с помощью соответствующей конфигурации. Основываясь на различных настройках проекта, имело бы смысл привязать его к prepare-package или к package вместо этого фаза. Именно по этой причине плагин по умолчанию не привязан ни к какой фазе, иначе было бы необходимо отделить его от одной из фаз, если вы используете другую.

Цели Для Командной Строки

Давайте взглянем на плагин, который используется из команды более или менее исключительно. Плагин Versions Maven имеет множество целей, которые все предназначены для вызова через командную строку, а не в рамках жизненного цикла .

Взгляните на типичный пример того, как используется плагин Versions Maven . У нас есть проект, в котором мы хотели бы изменить номер версии. Это можно легко сделать, используя следующий вызов:

$ mvn versions:set -DnewVersion=1.2.0 -DgenerateBackupPoms=false
...

Таким образом, плагин изменит версии в pom.xml файл. Вы должны запомнить этот вариант -DgenerateBackupPoms=false каждый раз, когда вы вызываете его, в противном случае будут создаваться резервные копии оригинала pom.xml файлы ( pom.xml.versionsBackup ). После этого вы должны либо удалить эти файлы вручную, либо с помощью системы управления версиями, но эту ситуацию можно улучшить, используя конфигурацию только для командной строки. Конфигурация выглядит следующим образом:


  
    
      
        
          org.codehaus.mojo
          versions-maven-plugin
          2.8.1
          
            
              default-cli
              
                false
              
            
          
        
        ...
      
    
  

Теперь вы можете сделать более простой вызов, подобный этому:

$ mvn versions:set -DnewVersion=2.0.0-SNAPSHOT
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------< com.soebes.articles.plugins:configuration >--------------
[INFO] Building configuration 1.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.8.1:set (default-cli) @ configuration ---
[INFO] Local aggregation root: /.../configuration
[INFO] Processing change of com.soebes.articles.plugins:configuration:1.0.0-SNAPSHOT -> 2.0.0-SNAPSHOT
[INFO] Processing com.soebes.articles.plugins:configuration
[INFO]     Updating project com.soebes.articles.plugins:configuration
[INFO]         from version 1.0.0-SNAPSHOT to 2.0.0-SNAPSHOT
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.853 s
[INFO] Finished at: 2021-03-28T20:32:58+02:00
[INFO] ------------------------------------------------------------------------

Конфигурация для различных вызовов командной строки

Мы достигли интересного уровня настроек для плагинов Maven, к сожалению, есть ограничение. Вы можете настроить только один вызов командной строки ( default-cli ). Если вы хотите создать разную конфигурацию для разных вызовов CLI, это просто невозможно таким образом.

Начиная с Maven 3.3.1 + (тем временем, 5 лет назад) появилось интересное усовершенствование для вызова цели.

Давайте начнем с default-cli на основе предыдущих примеров (используя exec-maven-plugin здесь):



  
    
      
        org.codehaus.mojo
        exec-maven-plugin
        3.0.0
        
          
            default-cli
            
              com.soebes.test.First
            
          
        
      
     
  

Как подробно описано в предыдущих частях, теперь вы можете вызвать Maven следующим образом:

$ mvn exec:java
...

Это будет использовать вышеуказанную конфигурацию. Итак, теперь мы улучшаем пример следующим образом:



  
    
      
        org.codehaus.mojo
        exec-maven-plugin
        3.0.0
        
          
            default-cli
            
              com.soebes.test.First
            
          
          
            second-cli
            
              com.soebes.test.Second
            
          
        
      
     
  

Теперь вы можете вызвать Maven следующим образом:

$ mvn exec:java@second-cli

Я хотел бы подчеркнуть @second-clip после гола java который позволяет вам выбрать, какая из заданных записей ( .. ) будет использоваться при вызове цели. Итак, теперь вы можете создать конфигурацию по умолчанию через default-cli и несколько других конфигураций, которые можно выбрать, просто указав идентификатор во время вызова командной строки.

Это открывает новый уровень настройки вызова команд.

Возможно, вы знаете build-helper-maven-plugin , который можно использовать в сочетании с versions-maven-plugin для увеличения ваших версий без maven-release-plugin через командную строку следующим образом:

 mvn build-helper:parse-version versions:set \
     -DnewVersion=\${parsedVersion.nextMajorVersion}.0.0 \
     versions:commit

В этом вызове мы вызываем два разных плагина с тремя целями. Первый – это build-helper-maven-plugin с целью parse-version , а второй versions-maven-plugin с использованием цели set и, наконец, versions-maven-plugin с целью фиксации .

Цель parse-version считывает информацию из pom.xml связан с тегом версии в свойствах плагина и создает некоторые дополнительные полезные новые свойства, которые могут быть использованы позже для использования в части командной строки: -DnewVersion=\${проанализированная версия.nextMajorVersion}.0.0 . Это будет использовать свойство проанализированная версия.следующая основная версия и использовать его в качестве входных данных в set цель для определения новой основной версии. Это означает, что в конце концов он увеличит основную версию на единицу. Конечная цель фиксации внесет изменение в pom.xml постоянный. Это также может быть достигнуто с помощью ранее упомянутого -DgenerateBackupPoms=false свойство.

Как вы уже видели, мы должны использовать escape перед $ , чтобы предотвратить любой вид оболочки для расширения информации даже до вызова целей плагина. Теперь более важный момент: Не могли бы вы запомнить всю информацию, необходимую для этого вызова? Я не. Возможны и другие вещи, подобные этому (увеличьте младшую версию на единицу):

mvn build-helper:parse-version versions:set \
     -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.nextMinorVersion}.0 \
     versions:commit

Это становится все более и более утомительным и подверженным ошибкам. Мы можем улучшить это, используя pom.xml конфигурация (выдержка).


  org.codehaus.mojo
  versions-maven-plugin
  
    
      major
      
        set
      
      
        false
        ${parsedVersion.nextMajorVersion}.0.0-SNAPSHOT
      
    
  

Итак, теперь вы можете использовать следующий вызов для увеличения основной версии вашего проекта:

$ mvn build-helper:parse-version versions:set@major

Гораздо проще, не так ли? Кроме того, его гораздо легче запомнить и даже проще настроить в любом решении CI/CD, и вам не придется бороться с экранированием в разных средах. Мы можем и дальше совершенствоваться подобным образом:


  org.codehaus.mojo
  versions-maven-plugin
  
    
      major
      
        set
      
      
        false
        ${parsedVersion.nextMajorVersion}.0.0-SNAPSHOT
      
    
    
      minor
      
        set
      
      
        false
        ${parsedVersion.majorVersion}.${parsedVersion.nextMinorVersion}.0-SNAPSHOT
      
    
    
      patch
      
        set
      
      
        false
        ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion}-SNAPSHOT
      
    
  

Таким образом, мы можем увеличить младшую версию нашего проекта с помощью:

$ mvn build-helper:parse-version versions:set@minor

Номер патча выглядит следующим образом:

$ mvn build-helper:parse-version versions:set@patch

Возможно, вы заметили небольшую проблему в конфигурации, потому что при каждом выполнении false дублируется? Это можно решить очень легко, выполнив рефакторинг следующим образом:


  org.codehaus.mojo
  versions-maven-plugin
  
    false
  
  
    
      major
      
        set
      
      
        ${parsedVersion.nextMajorVersion}.0.0-SNAPSHOT
      
    
    
      minor
      
        set
      
      
        ${parsedVersion.majorVersion}.${parsedVersion.nextMinorVersion}.0-SNAPSHOT
      
    
    
      patch
      
        set
      
      
        ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion}-SNAPSHOT
      
    
  

Это лишь некоторые примеры того, как можно настроить вызов командной строки с помощью параметров конфигурации в Maven. Я надеюсь, что это немного помогло.

Оригинал: “https://dev.to/khmarbaise/maven-plugin-configuration-the-unknown-tiny-details-1emm”