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

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

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

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

или же

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

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

15 ответов

Решение

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

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

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

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

Подробнее о настройке прокси для 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>

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

Установите 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"

У меня также была эта проблема, и я решил ее, отредактировав файл 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>

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

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

Вы можете застрять на аутентификации для этого.

Чтобы установить 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

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

Просто чтобы добавить мой собственный опыт с этим: прокси моей компании 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 часть цели должна быть отделена от имени хоста, иначе это не будет работать.

Спасибо @krosenvold.

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

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

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

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

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

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

Если вы новичок в настройке прокси для 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 куда-нибудь еще

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

У меня была похожая проблема, когда я пытался построить портлет-мост в 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
[ОШИБКА] Сборка не может прочитать 1 проект -> [Помощь 1]
org.apache.maven.project.ProjectBuildingException: при обработке POM возникли некоторые проблемы:
[FATAL] Неразрешимый родительский POM: не удалось передать артефакт 
 org.apache.portals:bridges-pom:pom:1.0 from/to central (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]...
[ОШИБКА] Для получения дополнительной информации об ошибках и возможных решениях, пожалуйста, прочитайте следующие статьи:
[ОШИБКА] [Помощь 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, чтобы убедиться, что я не ошибаюсь в настройках прокси. Они были правильными, хотя со значением без кавычек:

    set 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 работал. Я хотел бы отменить исправление и проверить каждый шаг снова, но потратил слишком много времени. Отчитается как и когда.

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

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

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

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

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

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

Если вы уже JAVA_OPTS просто делать

export JAVA_TOOL_OPTIONS=$JAVA_OPTS

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

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

    • Включены настройки прокси-сервера в settings.xml. Я не предоставил настройки имени пользователя и пароля, чтобы использовать аутентификацию NTLM.

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

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

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

Другие вопросы по тегам