Хобрук: Ваш путь к мастерству в программировании

Выбор прокси для использования в maven?

Я использую Maven 3.x. Я знаю, как настроить прокси в файле .m2/settings.xml. Чего я не могу понять, так это как указать, какой из прокси используется, либо в командной строке, либо через какое-то системное свойство. Этот комментарий появляется в образце settings.xml, предоставленном maven.apache.org:

This is a list of proxies which can be used on this machine to connect to the network.
Unless otherwise specified (by system property or command-line switch), the first proxy
specification in this list marked as active will be used.

Но я нигде не нашел, где бы вам сказали (а) как настроить прокси в settings.xml для поддержки вышеупомянутого утверждения, что вы можете выбрать, какой прокси использовать, или (б) как указать в командной строке, какой прокси использовать.

Предположим следующее:

<settings>
  <proxies>
    <proxy>
      <id>work-one</id>
      <protocol>http</protocol>
      <host>1.2.3.4</host>
      <port>80</port>
      <nonProxyHosts>127.0.0.1,localhost,foo...</nonProxyHosts>
    </proxy>
    <proxy>
      <id>work-two</id>
      <protocol>http</protocol>
      <host>5.6.7.8</host>
      <port>80</port>
      <nonProxyHosts>127.0.0.1,localhost,bar...</nonProxyHosts>
    </proxy>
  </proxies>
</settings>

На самом деле есть три ситуации.

  • Office One: где вам нужно использовать прокси-сервер work-one.
  • Office Two: где вам нужно использовать прокси-сервер work-two.
  • Дом: там, где прокси не нужен.

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

  1. Как вы пишете запись прокси в settings.xml для поддержки выбора прокси по системному свойству или переключателю командной строки?
  2. Как вы либо устанавливаете системное свойство, либо переключатель командной строки, чтобы выбрать нужный прокси?
  3. Как выключить все прокси, когда вы дома?
  4. Добейтесь (1), (2) и (3) без редактирования файла settings.xml при каждом перемещении.
  5. Предлагаемое решение должно работать как в Linux, так и в Windows.
  6. Предлагаемое решение должно максимально минимизировать ввод командной строки.

УЖЕ ПЫТАЛИСЬ БЕЗ УСПЕХА

Использование профиля для установки свойств, которые затем используются в прокси: Сбой: жалоба на ошибки регулярных выражений в nonProxyHosts и нецелое число в порту, несмотря на то, что профиль был указан в командной строке через - Аргумент P, а объявление профиля было перед объявлением прокси. См. 1608079, у меня это не сработало, а если бы сработало, как бы вы вообще не указали прокси?

% mvn -U -P workone
... usual stuff...
[WARNING] Some problems were encountered while building the effective settings
[WARNING] Unable to parse element 'port', must be an integer (position: END_TAG seen ...<port>${proxy-port}</port>... @243:30) caused by: java.lang.NumberFormatException: For input string: "${proxy-port}"
... more stuff ...
[ERROR] Internal error: java.util.regex.PatternSyntaxException: Illegal repetition near index 0
[ERROR] ${proxy-no_proxy}
[ERROR] ^

Настройки.xml были такими:

<settings>
...

  <profile>
    <id>workone</id>
    <properties>
        <proxy-protocol>http</proxy-protocol>
        <proxy-port>80</proxy-port>
        <proxy-host>hostnameone</proxy-host>
        <proxy-no_proxy>127.0.0.1,127.0.1.1,localhost,machine,*.local,*.domain.name.com</proxy-no_proxy>
    </properties>
  </profile>

  <profile>
    <id>worktwo</id>
    <properties>
        <proxy-protocol>http</proxy-protocol>
        <proxy-port>80</proxy-port>
        <proxy-host>hostnametwo</proxy-host>
        <proxy-no_proxy>127.0.0.1,127.0.1.1,localhost,machine,*.local,*.other.domain.name.com</proxy-no_proxy>
    </properties>
  </profile>
</profiles>
<proxies>
    <proxy>
        <protocol>${proxy-protocol}</protocol>
        <host>${proxy-host}</host>
        <port>${proxy-port}</port>
        <nonProxyHosts>${proxy-no_proxy}</nonProxyHosts>
    </proxy>
</proxies>
</settings>

Предполагая, что id был "именем профиля" прокси-сервера: Ошибка: поскольку вы не хотите, чтобы прокси-сервер использовался по умолчанию, для параметра active необходимо было установить значение false. Если вы не укажете значение active, по умолчанию будет установлено значение true, и автоматически будет использоваться первый активный прокси-сервер. Если вы установите active=false, -P work-one не включит прокси. Если вы оставите их оба активными = истинными, то первый будет использоваться независимо, что не будет работать, если вы не находитесь за этим прокси, и не будет работать, когда вы находитесь дома.

Свойства системы Java: Ошибка: есть примеры, предлагающие установить свойства системы Java для прокси-серверов, однако в этих примерах также говорится, что это не будет работать в ряде ситуаций, которые обычно встречаются в maven. Это также привело бы к большому количеству ввода в командной строке, что нежелательно.

Сценарий для Linux: Сбой, не работает для Windows: Да, у меня есть сценарий для Linux, который устанавливает прокси-серверы для различных инструментов, которые я использую, однако это решение не работает для Windows, и поэтому не является ответом на этот вопрос. Это также неудобно, поскольку, если сеть не подключается правильно до входа в систему, вы получаете фиктивную информацию о прокси-сервере. (Исправить сеть, выйти из системы, войти снова, прокси в порядке, тьфу.)


ПРОМЕЖУТОЧНЫЙ РЕЗУЛЬТАТ: ответ, похоже, заключается в том, что нет способа справиться с этим или множества других вещей в файле settings.xml. В результате я в настоящее время отказываюсь принимать ответ на неопределенный срок.

Профили кажутся наиболее вероятным местом для решения этой проблемы, но proxies не является одним из блоков, которые вы можете ввести внутри блока profile, равно как и mirrors (что еще я столкнулся с необходимостью есть три способа установить его).

19.09.2014

  • Я бы предложил создать репозиторий git в «${HOME}/.m2/» и зарегистрировать settings.xml. Создание ветки для каждого местоположения. Мне нужно просто изменить местоположение git checkout WORK, git checkout WORK1 или git checkout HOME, что сводится к одной команде для каждого местоположения, и вам не нужно добавлять дополнительные параметры к вашему вызову maven. 21.09.2014
  • @khmarbaise Да, как и ответ coderplus, это может сработать, но я действительно надеюсь на более безумный ответ. Раздражает, что у maven, похоже, есть место для всей информации, необходимой для того, чтобы вы могли выбрать прокси-сервер либо из командной строки, либо как часть активации, за исключением способа сделать это на самом деле. 22.09.2014
  • Обычно вы не используете разные репозитории/прокси только один. Таким образом, git - это лучшее, что вы можете сделать (или, может быть, вы можете создать для этого несколько сценариев). Кроме того, у меня это работает уже более 3 лет... Если вам нужна такая возможность в Maven, вы можете начать создавать jira и создайте для него патч, если хотите. 23.09.2014
  • «Обычно» зависит от вашего опыта ;-) Я часто работаю с подрядчиками из других компаний, которые работают в наших местных офисах, их местных офисах и дома. Просто я раньше не использовал Maven в этой среде, поэтому я не сталкивался с проблемой прокси. Я все еще надеюсь на другой ответ. 24.09.2014
  • @khmarbaise Это похоже на Jira, и патч должен быть таким. Я рассмотрю код в неопределенном будущем, чтобы понять, будет ли легко просто втиснуть прокси (и зеркала) в то, что вам разрешено помещать в профиль. 29.09.2014
  • в соответствии с этим maven.apache.org/guides/mini/guide-proxies.html , вы должны использовать | в качестве разделителя, а не , 30.10.2019

Ответы:


1

mvn имеет переключатель -s

-s,--settings <arg>                    Alternate path for the user
                                        settings file

Мне не удалось динамически переключать прокси из командной строки. В итоге я создал 3 отдельных файла настроек (по одному для каждого прокси), скажем, work1-settings.xml, work2-settings.xml, settings.xml (для домашней сети).

Я установил переменные среды Windows, например

WORK1=-s c:\Users\coderplus\.m2\work1-settings.xml
WORK2=-s c:\Users\coderplus\.m2\work2-settings.xml

Когда я был дома, я использовал

mvn clean install

(это выберет файл settings.xml по умолчанию)

Когда на работе1, я бы использовал

mvn clean install %WORK1%

На работе2 я бы использовал

mvn clean install %WORK2%
19.09.2014
  • Это может сработать, но я действительно надеюсь на более циничный ответ. Я имею в виду, какой смысл иметь «id» в блоке прокси, если вы не можете использовать его для выбора активного прокси? 22.09.2014
  • Хотя это было много лет назад, я решил принять этот ответ как наименее болезненный. 24.05.2020
  • Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

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

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.