Как использовать Maven через прокси?

130

Хочу поделиться своим опытом использования maven через прокси.

Скорее всего, вы столкнетесь с исключениями и сообщениями вроде:

метаданные репозитория для: 'org.apache.maven.plugins' не могут быть получены из 
репозиторий: центральный из-за ошибки: Ошибка при передаче файла: В соединении отказано: подключиться

или

[ВНИМАНИЕ] Не удалось получить дескриптор плагина для org.apache.maven.plugins: maven-clean-
plugin: 2.5: Плагин org.apache.maven.plugins: maven-clean-plugin: 2.5 или один из его 
не удалось разрешить зависимости: не удалось прочитать дескриптор артефакта для 
org.apache.maven.plugins: Maven-плагин очистки: банка: 2,5

Как настроить Maven для использования прокси-сервера?

Богдан
источник
(Кто угодно) Не ​​могли бы перефразировать это в вопросе (например, как использовать Maven через прокси?)? Затем вы можете опубликовать текст своего вопроса в качестве ответа, чтобы соответствовать формату StackOverflow ..
Тим,
Я перефразировал это для вас, Богдан, пожалуйста, опубликуйте свой исходный контент в качестве ответа, если хотите
Богатый продавец
похоже, мы редактировали в одно и то же время
Rich Seller

Ответы:

145

Подробнее о настройке прокси для Maven см. В мини-руководстве .

По сути, вам необходимо убедиться, что раздел прокси в глобальных настройках ( [maven install]/conf/settings.xml) или пользовательских настройках ( ${user.home}/.m2/settings.xml) настроен правильно. Лучше сделать это в ваших пользовательских настройках, чтобы не хранить пароль в виде обычного текста в общедоступном месте.

В Maven 2.1 введено шифрование паролей , но я не успел проверить, применяется ли шифрование к настройкам прокси, а также к паролям репозитория (хотя не понимаю, почему это не так).

Для информации: в файле settings.xml есть закомментированная конфигурация прокси и инструкции по ее изменению.

В мини-руководстве ваши настройки должны выглядеть примерно так:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                  http://maven.apache.org/xsd/settings-1.0.0.xsd">
[...]
  <proxies>
    <proxy>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxy.somewhere.com</host>
      <port>8080</port>
      <username>proxyuser</username>
      <password>somepassword</password>
      <nonProxyHosts>www.google.com|*.somewhere.com</nonProxyHosts>
    </proxy>
  </proxies>
[...]
</settings>
Богатый продавец
источник
Спасибо, но этот пост - скорее совет для других, чем вопрос. Я уже решил эту проблему, но потратил слишком много времени на неочевидные вещи. Я разместил это, чтобы это могло кому-нибудь пригодиться.
Богдан,
7
не могу найти файл setting.xml в каталоге m2. есть идеи почему? @Rich Seller
Ariox66
5
Вы должны поместить это туда. Вы можете найти образец settings.xml в maven_home, месте, где вы распаковали двоичные файлы maven.
Рави
И если прокси не требует аутентификации, то <username>и <password>элементы должны быть удалены (и не дали пустое содержание). Мне потребовалось время, чтобы понять.
dmcontador
50

Как использовать прокси-сервер socks?

Настройте где-нибудь SSH-туннель к серверу:

ssh -D $PORT $USER@$SERVER

Linux (bash):

export MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=$PORT"

Окна:

set MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=$PORT"
gs1
источник
2
Использование прокси-сервера socks MAVEN_OPTS- единственный способ заставить Maven загружаться через HTTPS. Использование прокси HTTP или HTTPS через MAVEN_OPTSили settings.xmlприводит кorg.apache.maven.wagon.providers.http.httpclient.impl.execchain.RetryExec execute INFO: I/O exception (java.net.SocketException) caught when processing request to {tls}->http://proxy.mycompany.com:911->https://repo.maven.apache.org:443: SOCKS: TTL expired
Михай Капота
Для httpдоверенных лиц:export MAVEN_OPTS="-DproxyHost=127.0.0.1 -DproxyPort=$PORT"
Омид
Отлично, спасибо. Если вы хотите использовать эти параметры только один раз для одной команды, вы можете ввести: MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080" mvn clean installСледующие mvnкоманды в том же сеансе будут без прокси.
Эрик Думинил,
29

У меня тоже была эта проблема, и я решил ее, отредактировав settings.xmlфайл в своей .m2папке. Мой settings.xmlсейчас такой:

<settings>
  <proxies>
    <proxy>
      <id>genproxy</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxyHost</host>
      <port>3128</port>
      <username>username</username>
      <password>password</password>
    </proxy>
 </proxies>
</settings>
pedrobisp
источник
1
В моем случае это не загрузка файлов jar. Я все перепробовал
Файзан Мубашер
28

Также обратите внимание, что некоторые плагины (на ум приходят удаленные ресурсы) используют действительно старую библиотеку, которая принимает конфигурацию прокси только через MAVEN_OPTS;

-Dhttp.proxyHost=<host> -Dhttp.proxyPort=<port> -Dhttps.proxyHost=<host> -Dhttps.proxyPort=<port>

Вы могли застрять на авторизации для этого.

krosenvold
источник
У меня не работало на Ubuntu 14.04 с maven 3.0.5 из репозитория Ubuntu. Настройка прокси в файле settings.xml сработала.
Mihai Capotă
1
Работал для меня на Ubuntu 14.04 с Maven 3.0.4
rmv
Примером такой установки MAVEN_OPTS является сборка Maven из исходного кода с использованием Maven. Без MAVEN_OPTS загрузка LICENSE-2.0 невозможна, несмотря на загрузку множества JAR-файлов.
Permaquid
@krosenvold спасибо, это решение сработало для меня. Я уже установил прокси в settings.xml, но был плагин cxf, который хотел сгенерировать код из wsdl, который не работал. Это устранило мою проблему.
Vishal
23

Чтобы установить Maven Proxy :

Отредактируйте сеанс прокси в вашем файле ~ / .m2 / settings.xml . Если вы не можете найти файл, создайте его.

<settings>
<proxies>
    <proxy>
        <id>httpproxy</id>
        <active>true</active>
        <protocol>http</protocol>
        <host>your-proxy-host</host>
        <port>your-proxy-port</port>
        <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
<proxy>
        <id>httpsproxy</id>
        <active>true</active>
        <protocol>https</protocol>
        <host>your-proxy-host</host>
        <port>your-proxy-port</port>
        <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>

</proxies>
</settings>

или

Отредактируйте сеанс прокси в вашем {M2_HOME} /conf/settings.xml

Надеюсь, поможет.. :)

Сарат Чандра
источник
15

Скорее всего, это вызвано двумя проблемами:

  1. Вам необходимо добавить конфигурацию прокси в ваш settings.xml. Вот уловка в поле вашего имени пользователя. Убедитесь, что он выглядит как домен \ имя пользователя. Важно указать домен и поставить точную косую черту '\'. Вы можете использовать тег <! [CDATA []]>, если ваш пароль содержит символы, не поддерживающие xml.
  2. Я заметил, что maven 2.2.0 иногда вообще не работает через прокси, а 2.2.1 работает отлично.

Если некоторые из них не указаны - maven может вывести случайные сообщения об ошибках.

Надеюсь, что я спас кого-то от поиска в Google по этой проблеме в течение 6 часов, как и я.

Богдан
источник
Вы используете прокси NTLM? из мини-руководства: «Обратите внимание, что [c] в настоящее время NTLM-прокси не поддерживаются, поскольку они не были протестированы. Вы можете использовать соответствующие системные свойства в JDK 1.4+, чтобы заставить эту работу».
Богатый продавец
Не уверен в этом. Это корпоративный прокси, который на самом деле находится в 600 милях от меня, и в эти выходные никто из системных администраторов не работает. Так что теперь не могу никого спрашивать. Будет интересно узнать. Я знаю, что он поддерживает http, socks и другие протоколы. Может быть, это тоже NTML.
Богдан,
14

Просто чтобы добавить свой собственный опыт в этом: прокси моей компании http://webproxy.intra.companyname.com:3128. Чтобы maven работал через этот прокси, настройки должны быть точно такими , как это

<settings>
  <proxies>
    <proxy>
      <id>default</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>webproxy.intra.companyname.com</host>
      <port>3128</port>
    </proxy>
  </proxies>
</settings>

В отличие от некоторых других файлов конфигурации прокси, protocolздесь описывается, как подключиться к прокси-серверу, а не какие типы протоколов следует проксировать. httpЧасть мишени должна быть отделилась от имени хоста, иначе он не будет работать.

Энди Джонс
источник
В этот раз я просто экспериментировал с обратным. Протокол здесь предназначен для описания того, какой протокол должен использовать этот прокси. Мне только что удалось настроить прокси-сервер протокола https, который подключается к прокси-серверу http с помощью <protocol> https </protocol>
Оливье Эмблет,
Спасибо! Это сработало для меня! У меня было предварительно записано «http: //», и это не удалось
Джесси МакКолл
11

Спасибо @krosenvold.

Если изменения файла настроек не работают, попробуйте это в командной строке с файлом POM.

mvn install -Dhttp.proxyHost=abcproxy -Dhttp.proxyPort=8080 -Dhttps.proxyHost=abcproxy -Dhttps.proxyPort=8080

Это помогло мне сразу после смены пароля.

user1189363
источник
11

Я запускаю cntlmлокально, настроил NTLMv2хэши паролей для аутентификации с корпоративным прокси и использую

export MAVEN_OPTS="-DproxyHost=127.0.0.1 -DproxyPort=3128"

использовать этот прокси из maven. Конечно, используемый вами прокси должен поддерживать cntlm/ NTLMv2.

Питер Хофман
источник
`set MAVEN_OPTS = -DproxyHost = 127.0.0.1 -DproxyPort = 3128` для windows
qxo
PowerShell может установить переменную системной среды: [Environment]::SetEnvironmentVariable("MAVEN_OPTS", "-DproxyHost=127.0.0.1 -DproxyPort=3128", "Machine")
Boggin,
6

И чтобы добавить к этой теме, вот мой опыт ниже ... Действительно странно и требует много времени, поэтому я подумал, что стоит добавить.

У меня была аналогичная проблема при попытке построить портлет-мост в Windows со следующими ошибками:

Скачивание: http://repo1.maven.org/maven2/org/apache/portals/bridges-pom/1.0/bridges-pom-1.0.pom
[DEBUG] Файл отслеживания разрешения чтения C: \ Documents and Settings \ myuser \ .m2 \ repository \ org \ apache \ portals \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[DEBUG] Запись файла отслеживания разрешения C: \ Documents and Settings \ myuser \ .m2 \ repository \ org \ apache \ portals \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[ERROR] Сборка не может прочитать 1 проект -> [Справка 1]
org.apache.maven.project.ProjectBuildingException: при обработке POM возникли некоторые проблемы:
[FATAL] Неразрешаемый родительский POM: не удалось передать артефакт.
org.apache.portals: bridges-pom: pom: 1.0 из / в центральный (http://repo1.maven.org/maven2): Ошибка при передаче файла: repo1.maven.org и 'parent.relativePath' указывает неправильный локальный
POM @ строка 23, столбец 11
...
[ОШИБКА] В проекте org.apache.portals.bridges: portals-bridges-common: 2.0 (H: \ path_to_project \ portals-bridges-common-2.0 \ pom.xml) 1 ошибка
[ОШИБКА] Неразрешаемый родительский POM: не удалось передать артефакт org.apache.portals: bridges-pom: pom: 1.0 из / в центральный (http://repo1.maven.org/maven2):
Ошибка при передаче файла: repo1.maven.org и 'parent.relativePath' указывает на неправильный локальный POM @ строка 23, столбец 11: Неизвестный хост repo1.maven.org -> [Справка 2]
...
[ERROR] Дополнительные сведения об ошибках и возможных решениях см. В следующих статьях:
[ОШИБКА] [Справка 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ОШИБКА] [Справка 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

После небольшого серфинга я попробовал пару вещей:

  • Пытался установить parent.relativePath как пустой, чтобы maven не считал родительский элемент локальным. Это в соответствии с предложением о SO при сбое сборки Hudson: неразрешимый родительский POM и на этом форуме . Это не подействовало.

  • Я также попытался убедиться, что репозиторий явно указан в моем settings.xml, но это тоже не повлияло.

  • Затем я убедился, что mvn был вынужден искать в репозитории, а не полагаться на его собственную историю, как это обсуждалось в этом блоге Сартоном . К сожалению, это тоже не проблема.

  • В некотором отчаянии я затем повторно просмотрел свой MAVEN_OPTS, чтобы убедиться, что я не нарушаю свои настройки прокси. Они были правильными, хотя и без указания значения:

    установить MAVEN_OPTS = -Dhttp.proxyHost = myproxy.mycompany.com -Dhttp.proxyPort = 8080 -Xmx256m

  • Итак, наконец, я переместил конфигурацию прокси в свой settings.xml, и это сработало:

    <proxies>
      <proxy>
        <id>genproxy</id>
        <active>true</active>
        <protocol>http</protocol>
        <!--username>proxyuser</username-->
        <!--password>proxypass</password-->
        <host>myproxy.mycompany.com</host>
        <port>8080</port>
        <nonProxyHosts>*.mycompany.com|127.0.0.1</nonProxyHosts>
      </proxy>
    </proxies>

На самом деле не уверен, почему мой оригинальный MAVEN_OPTS не работал (кавычки?), А конфигурация settings.xml работала. Я хотел бы отменить исправление и снова проверить каждый шаг, но потратил слишком много времени. Отчитаюсь как и когда.

wmorrison365
источник
Вы действительно указали имя пользователя и пароль в MAVEN_OPTS?
bcmoney
1
Я не думаю, что это сделал, но тогда мне не нужно для моего прокси-сервера. Как видите, это возможно. Помимо проблем с безопасностью, вы можете попробовать. Я так понимаю, у вас все еще проблемы, если вы зашли так далеко?
wmorrison365 05
4

Я знаю, что это не совсем ответ на вопрос, но, возможно, стоит узнать об этом, если кто-то ищет этот пост. Также можно установить прокси-сервер репозитория Maven, например nexus .

Ваш maven будет настроен для связи с локальным прокси-сервером Nexus, а затем Nexus будет извлекать (и кэшировать) артефакты. Его можно настроить через веб-интерфейс и поддерживает (http) прокси).

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

Ссылка на вопрос; с Nexus есть красивый графический интерфейс для настройки прокси, и это нужно делать только в одном месте, а не для каждого разработчика.

extraneon
источник
3

если вы новичок в настройке прокси для Maven В моем случае сначала проверьте свою домашнюю папку, есть ли .m2в ней папка, и в ней должен быть файл с именем, settings.xmlесли не создать его, вставьте его и измените, hostа portзатем, если необходимо, изменитеnonProxyHosts

Домашняя папка - C: \ Users \ {UserName}

<settings>
<proxies>
    <proxy>
        <id>httpproxy</id>
        <active>true</active>
        <protocol>http</protocol>
        <host>your-proxy-host</host>
        <port>your-proxy-port</port>
        <nonProxyHosts>localhost</nonProxyHosts>
    </proxy>
<proxy>
        <id>httpsproxy</id>
        <active>true</active>
        <protocol>https</protocol>
        <host>your-proxy-host</host>
        <port>your-proxy-port</port>
        <nonProxyHosts>localhost</nonProxyHosts>
    </proxy>

</proxies>
</settings>

Если в любом случае это не поможет, перейдите и внесите изменения в этом месте домашней папки.

/conf/settings.xml

Я использую Eclipse в качестве среды IDE.
Надеюсь, это поможет !!

Примечание. Чтобы удалить прокси, просто переместитесь settings.xmlв другое место.

Akitha_MJ
источник
Чтобы удалить прокси, просто переместите settings.xml куда-нибудь еще
Akitha_MJ
1

Если maven работает через прокси, но не работает с некоторыми плагинами, которые он вызывает, попробуйте JAVA_TOOL_OPTIONSтакже выполнить настройку с помощью -Dhttp*.proxy*настроек.

Если вы уже JAVA_OPTSсделали

export JAVA_TOOL_OPTIONS=$JAVA_OPTS
auselen
источник
0

За исключением упомянутых выше методов, с некоторыми усилиями вы можете запустить maven через прокси с помощью библиотеки jproxyloader (на странице есть пример, как это сделать: http://jproxyloader.sourceforge.net/ ). Это позволяет настроить socks-прокси только для загрузки артефактов.

В решении, упомянутом duanni (установка -DsocksProxyHost), есть одна проблема. Если у вас есть интеграционные тесты, работающие с локальной базой данных (или другие тесты, подключающиеся к URL-адресу, который не должен проходить через прокси). Эти тесты перестанут работать, потому что подключения к базе данных также будут направлены на прокси. С помощью jProxyLoader вы можете настроить прокси только для хоста nexus. Кроме того, если вы хотите, вы можете передавать подключения к базе данных через другой прокси.

walkeros
источник
0

Иногда вам нужно добавить другие <proxy></proxy>теги и указать https в тегах протокола:<protocol>https</protocol>

Pepe
источник
0

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

  • Изменены сетевые настройки Maven JRE (\ jre \ lib \ net.properties) для использования системных настроек прокси.

    https.proxyHost=proxy DNS
    https.proxyPort=proxy port
  • Включены настройки прокси-сервера в settings.xml. Я не предоставил настройки имени пользователя и пароля для использования аутентификации NTLM.

siachen345
источник
0

Maven предоставляет встроенный метод для этого через файл с именем settings.xml , и это было описано в других ответах. Однако обычно, особенно в Linux, инструменты командной строки автоматически используют прокси, указанный в переменной средыhttps_proxy .

Чтобы следовать принципу « Не повторяйся» (который призван помочь избежать ошибок), было бы неплохо, если быmvn бы можно было автоматически работать и с ним.

Вот сценарий оболочки, который выполняет необходимые преобразования:

#! /usr/bin/env bash

function javaproxy {
    ## using "Shell Parameter Expansion"
    request_scheme=$1 ; proxy=$2
    notscheme=$(echo ${proxy#*://}) ## parse
    scheme=$(echo ${proxy%${notscheme}}) ## remove
    scheme=$(echo ${scheme%://}) ## strip
    hostport=$(echo ${proxy#*//*}) ## parse
    host=$(echo ${hostport%:*}) ## parse
    port=$(echo ${hostport#${host}}) ## remove
    port=$(echo ${port#:}) ## strip
    scheme=$(echo ${scheme:-http}) ## default
    host=$(echo ${host:-localhost}) ## default
    port=$(echo ${port:-8080}) ## default
    echo -n " -D${request_scheme}.proxyHost=${host}"
    echo -n " -D${request_scheme}.proxyPort=${port}"
}

JTO=""

if [ $http_proxy ] ; then
    JTO="${JTO}$(javaproxy http ${http_proxy})"
fi

if [ $https_proxy ] ; then
    JTO="${JTO}$(javaproxy https ${https_proxy})"
fi

if [ $no_proxy ] ; then
    JTO="${JTO} -Dhttp.nonProxyHosts=$(echo \"${no_proxy}\"|tr ',' '|')"
fi

   export JAVA_TOOL_OPTIONS=${JTO}
   echo "JAVA_TOOL_OPTIONS=${JAVA_TOOL_OPTIONS}"

   mvn_friendliness_options+=--update-snapshots
   mvn ${mvn_friendliness_options} $@

Вы можете назвать это как-нибудь proxied_mvnи запустить как:

$ https_proxy=http://localhost:58080 ./proxied_mvn clean package

В качестве альтернативы вы можете просто переместить настройку среды в свои сценарии запуска.

подводные камни

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

  • Учетные данные Nexus доступны и верны (только при необходимости)

    Проверить с mvn help:effective-settings

  • Кэширование Maven: «разрешение не будет повторяться»

    mvn clean package --update-snapshots

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

  • Более старые версии Java могут потребовать _JAVA_OPTIONSвместо JAVA_TOOL_OPTIONS.

эпилог

Существует несколько видов прокси . Соответственно, есть более чем один способ интерпретации этого вопроса, что приводит к большому количеству несопоставимых ответов здесь.

Я подробно рассмотрел случай веб-прокси-сервера (прямого HTTP / HTTPS) , который используется для доступа в Интернет из корпоративной сети (для некоторых компаний). Это может заметно отличаться от прокси-сервера SOCKS , который также был рассмотрен в некоторых ответах здесь.

Да, кстати, поскольку он использует JAVA_TOOL_OPTIONS, эти решения могут быть применены и для запуска других приложений Java внутри прокси .


Напутственный совет ... Мой пример выше использует http://localhost:58080. Это потому, что я настроил переадресацию портов с моего CLIENT_PROXY=localhost:58080на настоящий сетевой прокси, используя WSL на моем клиенте удаленного доступа для запуска:

ssh $PROXY_CLIENT -R $CLIENT_PROXY:$SERVER_PROXY
Брент Брэдберн
источник