Gradle-Proxy-Konfiguration

159

Ich benötige einen Webzugriff von Gradle über einen Proxyserver, um die Gradle / Artifactory-Integration für Jenkins verwenden zu können. Um mögliche Ursachen für Probleme zu reduzieren, füge ich das Artifactory-Plugin manuell in build.gradle hinzu und führe es über die Befehlszeile aus:

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

Nach dieser Beschreibung habe ich in .gradle / gradle.properties in meinem Home-Verzeichnis Folgendes angegeben:

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

Mit der obigen Proxy-Konfiguration (von der sonst bekannt ist, dass sie funktioniert) schlägt dies fehl:

11: 33: 17.699 [ERROR] [org.gradle.BuildExceptionReporter] Auslöser: java.io.IOException: Server hat HTTP-Antwortcode zurückgegeben: 407 für URL: http://gradle.artifactoryonline.com/gradle/plugins/org/ jfrog / buildinfo / build-info-extractor-gradle / 1.0.1 / artifactoryplugin-1.0.1.gradle

Ich habe zwei Proxyserver zur Auswahl, und einer antwortet immer mit 407( Proxy-Authentifizierung erforderlich ), der andere mit 502( Bad Gateway ), daher werden offensichtlich die Optionen proxyHost und proxyPort verwendet.

Da der Benutzername (basierend auf einem Active Directory-Benutzer) einen Backslash enthält, habe ich beide \\und beide ausprobiert \, aber keiner hat funktioniert. Der angegebene Benutzer unterscheidet sich von dem Benutzer, der am Computer und in Active Directory angemeldet ist. Die Anmeldeinformationen dieses Benutzers sind für den Proxy nicht gültig, daher muss ich in der Lage sein, einen anderen Benutzer anzugeben.

Das Festlegen der gleichen Optionen in der Benutzeroberfläche von Jenkins oder Artifactory hat funktioniert.

Daniel Beck
quelle
1
Bei dem gleichen Problem half keine der Antworten hier (selbst die, die den veralteten / nicht veralteten Methoden folgten). dann wurde mir klar , https - Proxy muss eingestellt werden: stackoverflow.com/a/27686730/1024839
hkoosha
Sie sollten sich diese URL ansehen, vollständiger und aktualisierter (mit http und https): docs.gradle.org/current/userguide/…
Guillaume Husta
@ GuillaumeHusta Danke, aber bitte beachten Sie, dass diese Frage vor mehr als 5 Jahren gestellt wurde, als Gradle 0.8 die neueste Version war, und die Dokumentation dazu einfach falsch war (siehe meine eigene Antwort auf diese Frage).
Daniel Beck
Ich hatte dieses Problem bei der Verwendung von Anführungszeichen im Proxy. Verwenden Sie systemProp.http.proxyHost = xyz, nicht systemProp.http.proxyHost = 'xyz'
ir2pid

Antworten:

211

Verfeinerung über Daniels Antwort:

Nur HTTP-Proxy-Konfiguration

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

Nur HTTPS-Proxy-Konfiguration

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

Sowohl HTTP- als auch HTTPS-Proxy-Konfiguration

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

Proxy-Konfiguration mit Benutzer und Passwort

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.proxyUser =. proxyPassword = pass -Dhttp.nonProxyHosts = host1.com | host2.com

arbeitete für mich ( gradle.propertiesentweder in homedir oder im Projektverzeichnis schlug der Build immer noch fehl). Vielen Dank, dass Sie das Problem auf gradle hingewiesen haben, das diese Problemumgehung ermöglicht hat. Siehe Referenzdokument unter https://docs.gradle.org/current/userguide/build_environment.html#sec:accessing_the_web_via_a_proxy

Update Sie können diese Eigenschaften auch einfügen gradle-wrapper.properties(siehe: https://stackoverflow.com/a/50492027/474034 ).

Guillaume Berche
quelle
4
half mir auch bei der Verwendung von cntlm
Łukasz Siwiński
5
Wie entfernst du den Proxy?
Jonathan
2
auch -Dhttps.proxyUser = Benutzer -Dhttps.proxyPassword = pass
Owen B
10
Wenn Sie die Eigenschaften in setzen, ~/.gradle/gradle.propertiesstellen Sie sicher, dass Sie den Eigenschaften voranstellen systemProp, wie zum BeispielsystemProp.http.proxyHost=127.0.0.1
Stefan Haberl
1
Ich habe es versucht und nicht für mich gearbeitet. Ich musste die Optionen ( -Dhttp.proxyHostund dergleichen) als JAVA_OPTSUmgebungsvariable festlegen , damit es funktioniert.
GoldenD
66

Dies ist meine gradle.properties, bitte beachten Sie diesen HTTPS-Teil

systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=8118
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=8118
Kampau Ocu
quelle
55

In meinem habe build.gradleich die folgende Aufgabe, die die üblichen Linux-Proxy-Einstellungen verwendet, HTTP_PROXYund HTTPS_PROXYaus der Shell-Umgebung:

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
SourceSimian
quelle
2
Es macht Spaß! Es ist das build.gradle Ihres Roots oder das build.gradle Ihrer App?
Miao1007
1
Funktioniert auch unter Windows 7! Dies sollte die akzeptierte Antwort sein!
1
Vielen Dank! Das oben Gesagte funktionierte für Konfigurationen, für die kein Proxy-Passwort erforderlich ist. Ich habe es geändert, um mit oder ohne Proxy-Passwort zu arbeiten, siehe unten
Norbert
if (Geben Sie map.keySet () ein.) {
JustAnotherCoder
beste Antwort.
Ich
26

Für mich funktioniert das Hinzufügen dieser Konfiguration in der Datei gradle.properties des Projekts, wobei die Datei build.gradle lautet:

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

Wobei: proxyUrl die URL des Proxyservers ist ( http: // ..... )

proxyPort ist der Port (normalerweise 8080)

USER ist mein Domain-Benutzer

PASSWORT, mein Passwort

In diesem Fall ist der Proxy für http und https identisch

rtrujillor
quelle
23

Versuche Folgendes:

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

Raphael Vitor
quelle
2
Überlegen Sie, wann diese Frage gestellt wurde. Das Problem, auf das ich in meiner Antwort verweise, wurde als behoben in Richtung Gradle 1.0-Meilenstein-8 markiert.
Daniel Beck
2
@ Daniel diese Frage war das erste, was auftauchte, als ich nach "Gradle Proxy" suchte, überflog ich die Antworten und diese war die klarste für meine Bedürfnisse ...
Betlista
22

Mit einem sehr einfachen Java-Programm "URL anfordern" konnte ich das Problem replizieren.

http.proxyUserund http.proxyPasswordscheinen nicht standardmäßige, wenn auch beliebte Optionen zu sein, da sie nicht auf der Java-Referenzseite beschrieben sind, die im Gradle-Tutorial verlinkt ist . obwohl das Gradle-Handbuch sie erwähnt.

Es scheint, dass Java-Programme, die die Proxy-Authentifizierung unterstützen möchten, dies manuell tun müssen (und ich konnte dies mithilfe des Codes auf der verlinkten Seite tun).


Ich habe dieses Problem (und einen Fix) beim Gradle Issue Tracker eingereicht . Das angesprochene Problem GRADLE-1556 wurde in 1.0-Meilenstein-8 (Februar 2012) behoben.

Daniel Beck
quelle
Der verknüpfte Block wird für mich nur als Einladung angezeigt. Gibt es ein öffentliches Beispiel für diese Problemumgehung?
Mike Yockey
@yock Siehe den Anhang des Problems, das ich bei Gradle eingereicht habe, es ist sehr ähnlich.
Daniel Beck
19

Überprüfen Sie unter c: \ Benutzer \ Ihr Benutzername \ .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 | >
Charles Tempo
quelle
5
@ MurrayFoxcroft Wo sehen Sie einen Link in dieser Antwort?
Max Vollmer
Grundsätzlich eine Verknüpfung zum lokalen Computer und ein Datei-Dump. Bitte beschreiben Sie die Antwort genauer.
Murray Foxcroft
superrrrrr tnx, du weißt vielleicht nicht, wie nützlich dein Beitrag für mich war, aber trotzdem ein großes Dankeschön
Seyed Ali Roshan
@SeyedAliRoshan Wie können wir Proxy-Benutzer und Passwort als Argument übergeben? Ich möchte nicht globle gradle.propaerties Datei verwenden.
Nullpointer
@Nullpointer Hast du versucht, die Proxy-Einstellung im Gradle deines Projekts zu verwenden?
Seyed Ali Roshan
12

Erstellen Sie eine Datei mit dem Namen gradle.propertiesim Projektordner, in dem sich die build.gradleDatei befindet. Fügen Sie den folgenden Eintrag hinzu

     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

Wenn Sie DNS als Proxy verwenden, fügen Sie es wie folgt hinzu systemProp.https.proxyHost=www.proxysite.com

Für IP geben Sie einfach die IP mit aus http://oder https://
prüfen gradle offiziellen doc , um weitere Informationen und Proxy auf globaler Ebene einrichten

user2720864
quelle
9

Es gibt zwei Möglichkeiten, Gradle hinter einem Proxy zu verwenden:

Fügen Sie Argumente in der Befehlszeile hinzu

(Aus Guillaume Berches Beitrag)

Fügen Sie diese Argumente in Ihren gradle-Befehl ein:

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

oder diese Argumente, wenn Sie https verwenden:

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

Fügen Sie Zeilen in die Gradle-Konfigurationsdatei ein

in gradle.properties den folgenden Zeilen:

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.propertiesInformationen zum Speicherort der Datei finden Sie in der offiziellen Dokumentation unter https://docs.gradle.org/current/userguide/build_environment.html


BEARBEITEN: wie von @Joost gesagt: Ein kleines, aber wichtiges Detail, das ich anfangs übersehen habe: Beachten Sie, dass der tatsächliche Hostname KEINEN http://Protokollteil der URL enthält ...

Thibault
quelle
1
Ein kleines, aber wichtiges Detail, das ich anfangs übersehen habe: Beachten Sie, dass der tatsächliche Hostname KEINEN http://Protokollteil der URL enthält ...
Joost
5

Basierend auf der Antwort von SourceSimian; Dies funktionierte bei Windows-Domänenbenutzerkonten. Notiere dass der Benutzernamen keine Domain enthalten ist.

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
Kunal B.
quelle
Vielen Dank! Es gibt ein Update, wie man Proxy-Benutzernamen und Passwörter dynamisch erhält
Norbert
1

Ein Update zu @sourcesimian und der Antwort @ kunal-b, bei dem der Benutzername und das Kennwort dynamisch festgelegt werden, wenn dies in den Systemeigenschaften konfiguriert ist.

Im Folgenden werden der Benutzername und das Kennwort festgelegt, sofern angegeben, oder der Host und der Port werden hinzugefügt, wenn kein Benutzername und kein Kennwort festgelegt sind.

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())
        }
    }
}
Norbert
quelle
1

Für den Fall, dass ich versuche, einen Proxy über Android Studio einzurichten. Aussehen und Verhalten => Systemeinstellungen => HTTP-Proxy. Aber der Proxy hat nicht funktioniert, also klicke ich auf keinen Proxy.

Überprüfen NO PROXY wird nicht die Proxy - Einstellungen von den gradle.properties (Global) entfernen. Sie müssen es manuell entfernen.

Also entferne ich alle Eigenschaften, die mit systemProp beginnen, zum Beispiel - systemProp.http.nonProxyHosts = *. Local, localhost

Anirban
quelle
Ich habe mir eine Stunde lang die Haare ausgerissen, anscheinend auf einem Mac. Diese Eigenschaften wurden automatisch zu meinen hinzugefügt ~/.gradle/gradle.properties. Vielen Dank für den Hinweis.
EpicPandaForce
0

Wenn Sie sich hinter einem Proxy befinden und Eclipse verwenden, gehen Sie zu Window Menu --> Preferences --> General --> Network Connections . Wählen Sie die aktiven Anbieter als "Manuell" aus.

Klicken Sie im Abschnitt Proxy-Einträge auf HTTPS, klicken Sie auf Bearbeiten und fügen Sie Proxy-Host und -Port hinzu. Wenn Benutzername und Passwort erforderlich sind, geben Sie dies ebenfalls an. Es hat bei mir funktioniert!

Wer bin ich
quelle
0

Wenn dieses Problem mit dem HTTP-Fehler 407 nur bei ausgewählten Paketen aufgetreten ist, liegt das Problem nicht in der Proxy-Einstellung und der Internetverbindung. Sie können Ihren PC sogar über NAT dem Internet aussetzen und sind dennoch mit diesem Problem konfrontiert. In der Regel können Sie gleichzeitig die gewünschten Pakete im Browser herunterladen. Die einzige Lösung, die ich finde: Löschen Sie den .gradle-Ordner in Ihrem Profil (nicht im Projekt). Nach dieser Synchronisierung des Projekts dauert es lange, aber alles wird wiederhergestellt.

Almaz
quelle