Як використовувати Maven через проксі?


130

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

Ви, швидше за все, зіткнетеся з винятками та повідомленнями, такими як:

Метадані репозиторію для: 'org.apache.maven.plugins' не вдалося отримати з 
сховище: центральне через помилку: помилка при передачі файлу: відключення підключення: підключення

або

[ПОПЕРЕДЖЕННЯ] Не вдалося отримати дескриптор плагіну для org.apache.maven.plugins: maven-clean-
плагін: 2.5: плагін org.apache.maven.plugins: maven-clean-плагін: 2.5 або один із його 
залежності не вдалося усунути: не вдалося прочитати дескриптор артефактів для 
org.apache.maven.plugins: maven-clean-plugin: jar: 2.5

Як налаштувати Maven на використання проксі-сервера?


(Хто-небудь) Майте на увазі перефразування цього питання на власне питання (наприклад: Як я можу використовувати Maven через проксі?)? Потім ви можете опублікувати своє питання запитання як відповідь, щоб бути більш чітким у форматі StackOverflow ..
Тім

Я перефразував це для вас Богдане, будь ласка, опублікуйте свій оригінальний вміст як відповідь, якщо хочете
Багатий продавець

виглядає, що ми редагували одночасно
Rich Seller

Відповіді:


145

Докладніше про налаштування проксі для Maven див. У міні-посібнику .

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

Maven 2.1 представив шифрування паролів , але мені не вдалося перевірити, чи застосовується шифрування для налаштувань проксі, а також паролів сховища (не розумію, чому це не хотілося б).

Для інформації, у налаштуваннях.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
не можете знайти файл settings.xml у каталозі m2. будь-яка ідея чому? @Rich Seller
Ariox66

5
Ви повинні розмістити його там. Ви можете знайти зразок settings.xml з maven_home, де ви розпакували бінарні файли Maven.
Раві

Якщо проксі-сервер не потребує аутентифікації, елементи <username>та <password>елементи повинні бути видалені (а не надавати порожній вміст). Це знадобило мені час, щоб розібратися.
dmcontador

50

Як користуватися проксі-шкарпетками?

Налаштуйте тунель SSH на сервері десь:

ssh -D $PORT $USER@$SERVER

Linux (bash):

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

Windows:

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

2
Використання проксі-шкарпеток через 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
Mihai Capotă

Для 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>

1
У моєму випадку це не завантаження файлів jar. Я спробував все
Faizan Mubasher

28

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

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

Ви можете застрягнути на цьому авторі.


Не працював для мене на 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. Це вирішило мою проблему.
Вішал

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. Вам потрібно додати конфігурацію проксі-сервера до налаштувань.xml. Ось хитрість у полі вашого імені користувача. Переконайтеся, що він схожий на домен \ ім’я користувача. Налаштування домену там і встановлення цієї точної косої риски важливо '\'. Ви можете використовувати тег <! [CDATA []]>, якщо ваш пароль містить символи, не сприятливі для XML.
  2. Я помітив, що maven 2.2.0 взагалі не працює через проксі, де 2.2.1 працює чудово.

Якщо деякі з них опущені, maven може вийти з ладу зі випадковими повідомленнями про помилки.

Просто сподіваюся, що я врятував когось від гуглання навколо цієї проблеми за 6 годин, як і я.


Ви використовуєте проксі-сервер NTLM? з міні-посібника: "Зверніть увагу, що [c] терміни проксі-серверів NTLM не підтримуються, оскільки вони не були протестовані. Можливо, ви зможете використовувати відповідні властивості системи в JDK 1.4+ для того, щоб зробити цю роботу".
Багатий продавець

Не впевнений у цьому. Це корпоративний проксі, який насправді розміщений в 600 милях від мене, і ніхто з адміністрації системи не працює в офісі ці вихідні. Тож зараз ніхто не може просити. Це буде цікаво дізнатися. Я знаю, що він підтримує http, шкарпетки та інші протоколи. Можливо, це також 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

Це допомогло мені одразу після зміни пароля.


11

Я запускаю cntlmlocaly, налаштований з NTLMv2хешами паролів для автентифікації з корпоративним проксі, і використовую

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

використовувати цей проксі від maven. Звичайно, проксі, який ви використовуєте, повинен підтримувати cntlm/ NTLMv2.


`встановити 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: \ Документи та параметри \ myuser \ .m2 \ сховище \ org \ apache \ портали \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[DEBUG] Запис файлу відстеження роздільної здатності C: \ Документи та параметри \ myuser \ .m2 \ сховище \ org \ apache \ портали \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[ПОМИЛКА] Збірка не могла прочитати 1 проект -> [Довідка 1]
org.apache.maven.project.ProjectBuildingException: При обробці УЗО виникли деякі проблеми:
[FATAL] Нерозв’язний батьківський POM: не вдалося перенести артефакт
org.apache.portals: bridges-pom: pom: 1.0 від / до центрального (http://repo1.maven.org/maven2): помилка при перенесенні файлу: repo1.maven.org та "parent.relativePath" в неправильних локальних
РОМ @ рядок 23, стовпець 11
...
[ПОМИЛКА] Проект org.apache.portals.bridges: портали-мости-загальні: 2.0 (H: \ path_to_project \ portals-mostov-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 у програмі побудови Хадсона: провал: Нерозв’язний батьківський POM та на цьому форумі, що базується . Це не мало ефекту.

  • Я також намагався переконатися, що сховище було чітко вказано в моїх налаштуваннях.xml, але це також не мало ефекту.

  • Тоді я переконався, що mvn був змушений шукати сховище, а не покладатися на його власну історію, про що розповідав у цьому блозі Sarthon . На жаль, і це не було проблемою.

  • Тоді я відчайдушно переглянув свій 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 працювало. Я хотів би змінити виправлення та перевірити кожен крок заново, але витратив занадто багато часу. Повідомлять про те, як і коли.


Ви фактично вказали ім’я користувача та пароль в MAVEN_OPTS також?
bcmoney

1
Я не думаю, що я це робив, але тоді мені не потрібно для мого проксі-сервера. Як ви бачите, можливо, це можливо. Крім питань безпеки, ви можете спробувати. Я знаю, ти все ще маєш проблеми з тим, що потрапив так далеко?
wmorrison365

4

Я знаю, що це насправді не відповідь на питання, але, можливо, варто дізнатися того, хто шукає цю публікацію. Можливо також встановити проксі-сховище Maven, як nexus .

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

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

Посилання на запитання; у Nexus є приємний графічний інтерфейс для конфігурації проксі, і це потрібно робити лише в одному місці, і не для кожного розробника.


3

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

Домашня папка - C: \ Користувачі \ {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до деінде


Щоб видалити проксі, просто перемістіть settings.xml на де-небудь ще
Akitha_MJ

1

Якщо Maven працює через проксі - сервер , але не деякі з плагінів він посилаються, спробуйте встановити , JAVA_TOOL_OPTIONSа також з -Dhttp*.proxy*настройками.

Якщо ви це вже JAVA_OPTSзробили

export JAVA_TOOL_OPTIONS=$JAVA_OPTS

0

За винятком вищезазначених методик, ви можете запустити Maven через проксі, використовуючи бібліотеку jproxyloader (на сторінці є приклад, як це зробити: http://jproxyloader.sourceforge.net/ ). Це дозволяє налаштувати проксі-шкарпетки лише для завантаження артефактів.

У рішенні, згаданому duanni (налаштування -DsocksProxyHost) є одна проблема. Якщо у вас є інтеграційні тести, які працюють на локальній базі даних (або на інших тестах, що підключаються до URL, які не повинні переходити через проксі). Ці тести припиняють роботу, оскільки підключення до бази даних також будуть спрямовані на проксі. За допомогою jProxyLoader ви можете налаштувати проксі лише для хоста nexus. Крім того, якщо ви хочете, ви можете передати з'єднання до бази даних через інший проксі.


0

Деколи потрібно додати інші <proxy></proxy>теги та вказати https у тегах протоколу:<protocol>https</protocol>


0

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

  • Модифіковані налаштування JRE для мережі Maven (\ jre \ lib \ net.properties) для використання налаштування системного проксі.

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


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

Крім того, ви можете просто перемістити налаштування середовища у ваші сценарії запуску.

gotchas

Під час спроби налаштувати Maven на доступ до Nexus через проксі можна багато помилок . Сподіваємось, цей сценарій допоможе вирішити деякі найвибагливіші проблеми, але інші залишаються:

  • Доступні та правильні облікові дані Nexus (лише за потреби)

    Перевірте mvn help:effective-settings

  • Кешування Maven: "роздільну здатність не буде повторено"

    mvn clean package --update-snapshots

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

  • Старіші версії 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.