Настройка прокси Gradle


161

Мне нужен веб-доступ из Gradle через прокси-сервер, чтобы использовать интеграцию Gradle / Artifactory для Jenkins. Чтобы уменьшить возможные причины проблем, я вручную добавляю плагин Artifactory в build.gradle и запускаю его из командной строки:

apply {
    apply from: "http://gradle.artifactoryonline.com/gradle/plugins/org/jfrog/buildinfo/build-info-extractor-gradle/1.0.1/artifactoryplugin-1.0.1.gradle"
}

Следуя этому описанию, я указал следующее в .gradle / gradle.properties в моем домашнем каталоге:

systemProp.http.proxyHost=hostname
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=de\\username
systemProp.http.proxyPassword=xxx

С вышеупомянутой конфигурацией прокси (которая, как известно, работает), она завершается ошибкой:

11: 33: 17.699 [ОШИБКА] [org.gradle.BuildExceptionReporter] Причина: java.io.IOException: сервер вернул код ответа HTTP: 407 для URL: http://gradle.artifactoryonline.com/gradle/plugins/org/ jfrog / buildinfo / buildinfo-экстрактор-Gradle / 1.0.1 / artifactoryplugin-1.0.1.gradle

У меня есть два прокси-сервера на выбор, и один всегда отвечает 407( Требуется проверка подлинности прокси ), другой - 502( Плохой шлюз ), поэтому очевидно, что используются параметры proxyHost и proxyPort.

Поскольку имя пользователя (на основе пользователя Active Directory) содержит обратную косую черту, я пробовал оба \\варианта \, но ни один из них не работал. Указанный пользователь отличается от пользователя, вошедшего в систему на компьютере и в Active Directory. Учетные данные этого пользователя недействительны для прокси, поэтому мне нужно иметь возможность указать другого пользователя.

Установка тех же опций в графическом интерфейсе Дженкинса или Артефактуры работала.


1
с той же проблемой, ни один из ответов здесь не помог (даже те, которые следуют устаревшим / не осуждаемым методам). тогда я понял, что https прокси ДОЛЖЕН быть установлен: stackoverflow.com/a/27686730/1024839
hkoosha

Вы должны посмотреть на этот URL, более полный и обновленный (с http и https): docs.gradle.org/current/userguide/…
Гийом Хуста

@GuillaumeHusta Спасибо, но, пожалуйста, обратите внимание, что этот вопрос был опубликован более 5 лет назад, когда Gradle 0.8 был последней версией, и документация по этому вопросу была просто неправильной (см. Мой собственный ответ на этот вопрос).
Даниэль Бек

У меня была эта проблема при использовании кавычек в прокси, используйте systemProp.http.proxyHost = xyz not systemProp.http.proxyHost = 'xyz'
ir2pid

Ответы:


211

Уточнение по поводу ответа Даниила:

Конфигурация прокси только HTTP

gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 "-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost"

HTTPS только конфигурация прокси

gradlew -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129 "-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost"

Конфигурация прокси HTTP и HTTPS

gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129 "-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost"

Конфигурация прокси с пользователем и паролем

gradlew -Dhttp.proxyHost = 127.0.0.1 -Dhttp.proxyPort = 3128 - Dhttps.proxyHost = 127.0.0.1 -Dhttps.proxyPort = 3129 -Dhttps.proxyUser = user -Dhttps.proxyPassword = pass -Dhttp.proxyhser = user. proxyPassword = pass -Dhttp.nonProxyHosts = host1.com | host2.com

работал для меня (с gradle.propertiesлибо в homedir, либо в dir проекта, сборка все еще не работала ). Спасибо, что указали на проблему, которая дала этот обходной путь. См. Справочный документ по адресу https://docs.gradle.org/current/userguide/build_environment.html#sec:accessing_the_web_via_a_proxy.

Обновление Вы также можете поместить эти свойства в gradle-wrapper.properties(см .: https://stackoverflow.com/a/50492027/474034 ).


4
мне тоже помогло при использовании cntlm
Łukasz Siwiński

5
как удалить прокси?
Джонатан

2
также -Dhttps.proxyUser = пользователь -Dhttps.proxyPassword = pass
Оуэн Б

10
Если вы поставите свойства Into ~/.gradle/gradle.propertiesубедитесь , что вы префикс свойства с systemProp, как, напримерsystemProp.http.proxyHost=127.0.0.1
Стефан Haberl

1
Я попробовал это и не работал для меня. Я должен был установить опции ( -Dhttp.proxyHostи лайки) как JAVA_OPTSпеременную окружения, чтобы она работала.
GoldenD

66

Это мои gradle.properties, обратите внимание, те, HTTPS часть

systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=8118
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=8118

55

По моему у build.gradleменя есть следующая задача, которая использует обычные настройки прокси-сервера linux HTTP_PROXYи HTTPS_PROXYиз оболочки env:

task setHttpProxyFromEnv {
    def map = ['HTTP_PROXY': 'http', 'HTTPS_PROXY': 'https']
    for (e in System.getenv()) {
        def key = e.key.toUpperCase()
        if (key in map) {
            def base = map[key]
            def url = e.value.toURL()
            println " - systemProp.${base}.proxy=${url.host}:${url.port}"
            System.setProperty("${base}.proxyHost", url.host.toString())
            System.setProperty("${base}.proxyPort", url.port.toString())
        }
    }
}

build.dependsOn setHttpProxyFromEnv

2
Это весело! Это build.gradle вашего корня или build.gradle приложения?
Miao1007

1
Работает и на Windows 7! Это должен быть принятый ответ!

1
Спасибо! вышесказанное работает для конфигурации, которая не требует пароля прокси. Я изменил его для работы с паролем прокси или без него, см. Ниже
Norbert

if (введите map.keySet ()) {
JustAnotherCoder

лучший ответ. желаю, чтобы java-экосистема работала так из коробки
Avindra Goolcharan

26

Для меня работает добавление этой конфигурации в файл gradle.properties проекта, где файл build.gradle:

systemProp.http.proxyHost=proxyURL
systemProp.http.proxyPort=proxyPort
systemProp.http.proxyUser=USER
systemProp.http.proxyPassword=PASSWORD
systemProp.https.proxyHost=proxyUrl 
systemProp.https.proxyPort=proxyPort
systemProp.https.proxyUser=USER
systemProp.https.proxyPassword=PASSWORD

Где: proxyUrl - это адрес прокси-сервера ( http: // ..... )

proxyPort - это порт (обычно 8080)

USER - мой пользователь домена

ПАРОЛЬ, мой пароль

В этом случае прокси для http и https одинаков


23

Попробуйте следующее:

gradle -Dhttp.proxyHost=yourProxy -Dhttp.proxyPort=yourPort -Dhttp.proxyUser=usernameProxy -Dhttp.proxyPassword=yourPassoword


2
Подумайте, когда этот вопрос был задан. Проблема, на которую я ссылаюсь в своем ответе, была помечена как решенная для Gradle 1.0-milestone-8…
Даниэль Бек

2
@Daniel, этот вопрос был первым, что всплыло, когда я искал "Gradle Proxy", я просмотрел ответы, и этот был самым ясным для моих
нужд

22

Используя очень простую Java-программу «Request a URL», я смог воспроизвести проблему.

http.proxyUserи http.proxyPasswordкажутся нестандартными, хотя и популярными, опциями, так как они не описаны на справочной странице по Java, связанной с учебником Gradle ; хотя руководство Gradle упоминает их.

Кажется, Java-программы, которые хотят поддерживать прокси-аутентификацию, должны делать это вручную (и я смог сделать это, используя код на связанной странице).


Я отправил эту проблему (и исправление) в систему отслеживания проблем Gradle . Поднятая проблема GRADLE-1556 была решена в 1,0-миль-8 (февраль 2012 г.)


Связанный блок подходит для меня только для приглашения. Есть ли публичный пример этого обходного пути?
Майк Йоки

@yock Посмотрите вложение вопроса, который я представил Gradle, это очень похоже.
Даниэль Бек

19

Проверьте в c: \ Users \ ваше имя пользователя \ .gradle \ gradle.properties:

systemProp.http.proxyHost=<proxy host>
systemProp.http.proxyPort=<proxy port>
systemProp.http.proxyUser=<proxy user>
systemProp.http.proxyPassword=<proxy password>
systemProp.http.nonProxyHosts=<csv of exceptions>
systemProp.https.proxyHost=<proxy host>
systemProp.https.proxyPort=<proxy port>
systemProp.https.proxyUser=<proxy user>
systemProp.https.proxyPassword=<proxy password>
systemProp.https.nonProxyHosts=<csv of exceptions seperated by | >

5
@MurrayFoxcroft Где вы видите ссылку в этом ответе?
Макс Воллмер

В основном это ссылка на локальный компьютер и дамп файла. Пожалуйста, опишите ответ более подробно.
Мюррей Фоккрофт

superrrrrr tnx, вы можете не понимать, насколько полезным был ваш пост для меня, но все равно большое спасибо
Сейед Али Рошан,

@SeyedAliRoshan Как мы можем передать proxyUser и пароль по аргументу? Я не хочу использовать файл globle gradle.propaerties.
Nullpointer

@Nullpointer Вы пытались использовать настройку прокси внутри Gradle вашего проекта?
Сейед Али Рошан

12

Создайте файл с именем gradle.propertiesвнутри папки проекта, в которой он build.gradleнаходится. Добавьте следующую запись

     systemProp.http.proxyHost=proxy_url
     systemProp.http.proxyPort=proxy_port
     systemProp.http.proxyUser=USER
     systemProp.http.proxyPassword=PWD
     systemProp.https.proxyHost=proxy_url 
     systemProp.https.proxyPort=proxy_port
     systemProp.https.proxyUser=USER
     systemProp.https.proxyPassword=PWD

Если вы используете DNS для прокси, добавьте его как systemProp.https.proxyHost=www.proxysite.com

Для IP просто укажите IP без http://или https://
Проверьте официальный документ для получения более подробной информации и настройки прокси на глобальном уровне.


9

Существует два способа использования Gradle за прокси-сервером:

Добавить аргументы в командной строке

(Из поста Гийома Берша)

Добавьте эти аргументы в вашу команду gradle:

-Dhttp.proxyHost=your_proxy_http_host -Dhttp.proxyPort=your_proxy_http_port

или эти аргументы, если вы используете https:

-Dhttps.proxyHost=your_proxy_https_host -Dhttps.proxyPort=your_proxy_https_port

Добавить строки в конфигурационный файл Gradle

в gradle.properties добавить следующие строки:

systemProp.http.proxyHost=your_proxy_http_host
systemProp.http.proxyPort=your_proxy_http_port
systemProp.https.proxyHost=your_proxy_https_host
systemProp.https.proxyPort=your_proxy_https_port

( gradle.propertiesрасположение файла см. в официальной документации https://docs.gradle.org/current/userguide/build_environment.html.


РЕДАКТИРОВАТЬ: как сказал @Joost: небольшая, но важная деталь, которую я изначально упустил из виду: обратите внимание, что фактическое имя хоста НЕ содержит http:// протокольную часть URL-адреса ...


1
Небольшая, но важная деталь, которую я изначально упустил из виду: обратите внимание, что фактическое имя хоста НЕ содержит http://протокольную часть URL-адреса ...
Joost

5

Основано на ответе SourceSimian; это работало на учетных записях пользователей домена Windows. Обратите внимание, что имя пользователя не имеет включенного домена,

task setHttpProxyFromEnv {
    def map = ['HTTP_PROXY': 'http', 'HTTPS_PROXY': 'https']
    for (e in System.getenv()) {
        def key = e.key.toUpperCase()
        if (key in map) {
            def base = map[key]
            def url = e.value.toURL()
            println " - systemProp.${base}.proxy=${url.host}:${url.port}"
            System.setProperty("${base}.proxyHost", url.host.toString())
            System.setProperty("${base}.proxyPort", url.port.toString())
            System.setProperty("${base}.proxyUser", "Username")
            System.setProperty("${base}.proxyPassword", "Password")
        }
    }
}
build.dependsOn setHttpProxyFromEnv

Спасибо! Ниже приводится информация о том, как динамически получать имя пользователя и пароли прокси-сервера
Norbert

2

В случае, если я пытаюсь настроить прокси из Android Studio Appearance & Behavior => Системные настройки => HTTP Proxy. Но прокси не сработал, поэтому я нажимаю не прокси.

Проверка NO PROXY не удалит настройки прокси из gradle.properties (Global). Вы должны удалить его вручную.

Поэтому я удаляю все свойства, начиная с systemProp, например - systemProp.http.nonProxyHosts = *. Local, localhost


Я целый час рвал на себе волосы, видимо на Mac, эти свойства автоматически добавлялись в мои ~/.gradle/gradle.properties. Спасибо за указание на это.
EpicPandaForce

1

Обновление @ sourcesimian's и @ kunal-b's которое динамически устанавливает имя пользователя и пароль, если настроено в системных свойствах.

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

task setHttpProxyFromEnv {
    def map = ['HTTP_PROXY': 'http', 'HTTPS_PROXY': 'https']
    for (e in System.getenv()) {
        def key = e.key.toUpperCase()
        if (key in map) {
            def base = map[key]
            //Get proxyHost,port, username, and password from http system properties 
            // in the format http://username:password@proxyhost:proxyport
            def (val1,val2) = e.value.tokenize( '@' )
            def (val3,val4) = val1.tokenize( '//' )
            def(userName, password) = val4.tokenize(':')
            def url = e.value.toURL()
            //println " - systemProp.${base}.proxy=${url.host}:${url.port}"
            System.setProperty("${base}.proxyHost", url.host.toString())
            System.setProperty("${base}.proxyPort", url.port.toString())
            System.setProperty("${base}.proxyUser", userName.toString())
            System.setProperty("${base}.proxyPassword", password.toString())
        }
    }
}

0

Если вы находитесь за прокси и используете Eclipse, перейдите на Window Menu --> Preferences --> General --> Network Connections . Выберите активных поставщиков как «Вручную».

В разделе «Записи прокси» нажмите HTTPS, нажмите «Изменить» и добавьте прокси-хост и порт. Если требуется имя пользователя и пароль, укажите это также. Это сработало для меня!


0

Если эта проблема с ошибкой HTTP 407 произошла только с выбранными пакетами, то проблема не в настройке прокси-сервера и интернет-соединении. Вы даже можете выставить свой компьютер в интернет через NAT и все равно столкнетесь с этой проблемой. Как правило, в то же время вы можете скачать нужные пакеты в браузере. Единственное решение, которое я нахожу: удалите папку .gradle в своем профиле (не в проекте). После синхронизации проекта это займет много времени, но все восстановится.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.