Nano Hash - криптовалюты, майнинг, программирование

В Maven, как я могу динамически создавать значение свойства во время выполнения?

В maven очень легко установить свойства в pom со следующим синтаксисом:

...
<properties>
  <myValue>4.06.17.6</myValue>
 </properties>
...

Теперь мне нужно создать свойство, которое зависит от версии моего pom. Для создания свойства я хочу сделать следующее (псевдокод Java):

String[] parts = version.split("\\.");
String.format("V%s_%s_%s_P%s", splitted[0],  splitted[1],splitted[2],splitted[3]);
// example: 4.06.17.6 => V_4_06_17_P6

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

Любые идеи, как создать эти «динамические» свойства?

17.08.2012

Ответы:


1

В этом вам может помочь плагин Mojo Build-Helper Maven.

Существует ряд целей, которые можно использовать для преобразования свойств.

Есть

Вероятно, вам нужен regex-property, но если ваша версия номера соответствуют «стандартам», два других могут вас спасти.

Чтобы использовать цель regex-property, вы должны сделать что-то вроде

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.7</version>
        <executions>
          <execution>
            <id>regex-property</id>
            <goals>
              <goal>regex-property</goal>
            </goals>
            <configuration>
              <name>tag.version</name>
              <value>${project.version}</value>
              <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(-SNAPSHOT)?$</regex>
              <replacement>V$1_$2_$3_P$4</replacement>
              <failIfNoMatch>true</failIfNoMatch>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

Примечание: мое регулярное выражение может немного отличаться, поэтому вам следует проверить приведенное выше.

Примечание. Значение свойства будет доступно только для выполнения после фазы, к которой привязано это выполнение. Фаза по умолчанию, к которой он привязан, — validate, но если вы находитесь в другом жизненном цикле (например, жизненном цикле сайта), значение будет недоступно.

17.08.2012
  • А если я не привяжу плагин к фазе. Я использую плагин выпуска maven и называю выпуск цели: подготовка. Как сделать его доступным здесь? 17.08.2012
  • если вы не укажете фазу, по умолчанию она привязана к фазе validate, поэтому приведенный выше фрагмент кода выполнит цель, когда активна фаза проверки. когда вы вызываете цель напрямую, например. release:prepare, что происходит, так это то, что maven запускает цель напрямую, пропуская любые фазы жизненного цикла, поэтому сама цель release:prepare не увидит свойство но жизненный цикл, разветвленный с помощью release:prepare, увидит его. Таким образом, release:prepare не сможет использовать свойство для пометки SCM, но свойство будет присутствовать в разветвленной сборке, которую запускает подключаемый модуль выпуска. 17.08.2012
  • Если вы хотите, чтобы тег SCM был основан на свойстве (вы должны обновить свой вопрос, чтобы отразить, что это ваша цель, или начать второй вопрос), вам может потребоваться использовать что-то вроде maven.apache.org/plugins/maven-release-plugin/, хотя это не будет дать вам замену _, которую вы хотите, ни инъекцию _P. Я рекомендую изменить требования к имени тега, а не пытаться согнуть Maven ;-) 17.08.2012
  • ХОРОШО. Я создал новый вопрос. Может быть, больше повезло. Я не могу изменить определение имени тега, потому что многим отделам придется изменить поведение тегов. :-( 17.08.2012
  • Вау... 24 строки XML вместо 2 строк Java. Есть вариант чуть менее... многословный? 13.05.2013
  • @bacar Это бойкое сравнение. Есть около 9-10 строк фактической информации, 3 определяют, какую кодовую базу использовать, 2 определяют, когда запускать, и 5 определяют поведение. Ваши 2 строки java не охватывают, когда запускать жизненный цикл, режимы отказа и некоторые другие вещи... Добавьте это, и вы, вероятно, приблизитесь к счету 9-10 LoC... 13.05.2013
  • @StephenConnolly Вроде бы честно, но все равно безумно многословно ... это просто знаток, я думаю. Кроме того, это не эта бойкость. Каковы дополнительные усилия по добавлению 1 нового свойства для другого регулярного выражения с (в настоящее время вымышленным...) более выразительным решением по сравнению с решением maven? Я думаю, что для maven требуется целый дополнительный блок <execution> (остановите меня, если я ошибаюсь!) 13.05.2013
  • @bacar Я не говорю, что XML не является подробным, и если бы у вас было множество свойств, которые нужно установить таким образом, я бы изменил плагин, чтобы упростить его ... Плагин, разработанный для случая использования одного свойства .. , Для цели плагина с несколькими свойствами потребуется более 24 строк для установки только одной. Вопрос задан только для одного свойства... И свойства BTW являются анти-шаблоном, потому что они используются только во время самой сборки. 13.05.2013
  • Свойства можно экспортировать, так что это не то, что делает их антипаттернами. Я бы тоже не считал их антипаттернами сами по себе; часть анти-шаблона проистекает из сумасшествия Maven, заключающегося в том, чтобы впихнуть все в глубоко вложенную XML-структуру, а часть - из-за небрежности Maven в отношении фиксированного, нелегко расширяемого жизненного цикла (поэтому стандартный жизненный цикл продолжает прорастать новыми фазами). Кстати, именно эти сумасшествия подталкивают пользователей Maven к Gradle, где существуют другие сумасшествия, но, по крайней мере, они поправимы. 12.07.2018

  • 2

    Вы можете использовать подключаемый модуль maven build-helper, в частности его regex -свойство моджо. Взгляните на примеры использования (прокрутите до Set свойства, применив замену регулярного выражения к разделу значений).

    По сути, вы хотите, чтобы в вашем pom было что-то подобное, чтобы получить свойство myVersionTag, выведенное из myValue:

    <project>
      ...
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.7</version>
            <executions>
              <execution>
                <id>regex-property</id>
                <goals>
                  <goal>regex-property</goal>
                </goals>
                <configuration>
                  <name>myVersionTag</name>
                  <value>$\{myValue}</value>
                  <regex>(\d+)\.(\d+)\.(\d+)\.(\d+)</regex>
                  <replacement>V_$1_$2_$3_P$4</replacement>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      ...
    </project>
    
    17.08.2012
  • Я бы тоже отметил этот ответ как принятый, потому что он такой же, как и выше. Спасибо. 17.08.2012
  • Не совсем. В примере Игоря между «$» и «{» в элементе ‹value› ставится «\». Так говорится в документе Codehaus, но это неправильно. Цель регулярного выражения не будет работать с обратной косой чертой и работает без нее. А Codehaus не при делах. 17.11.2015
  • @SteveCohen Если документы неверны, откройте вопрос github.com/mojohaus/build -helper-maven-плагин/проблемы 02.09.2016

  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..