Ich brauche einen Webzugriff von Gradle über einen Proxyserver, um die Integration von Gradle/Artifactory für Jenkins zu verwenden. Um mögliche Ursachen für Probleme zu reduzieren, füge ich das Artifactory-Plugin manuell in build.gradle hinzu und führe es von der 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 der Beschreibung von this 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 (die sonst bekanntermaßen funktioniert) schlägt dies fehl:
11: 33: 17.699 [ERROR] [org.gradle.BuildExceptionReporter] Verursacht von: Java.io.IOException: Der Server hat den 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 Proxy-Server 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 sowohl \\
als auch \
ausprobiert, aber keiner hat funktioniert. Der angegebene Benutzer unterscheidet sich von dem Benutzer, der am Computer und am Active Directory angemeldet ist. Die Anmeldeinformationen dieses Benutzers sind für den Proxy nicht gültig. Daher muss ich einen anderen Benutzer angeben können.
Die gleichen Optionen in der GUI von Jenkins oder Artifactory einzustellen.
Mit einem sehr einfachen Programm "Request a URL" Java konnte ich das Problem replizieren.
http.proxyUser
und http.proxyPassword
scheinen keine Standardoptionen zu sein, auch wenn sie sehr beliebt sind, da sie nicht auf der Java Referenzseite beschrieben sind, die von der verlinkt ist Gradle Tutorial ; 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 mit dem Code auf der verlinkten Seite tun).
Ich habe dieses Problem (und einen Fix) an den Gradle-Issue-Tracker gesendet. Erhöhtes Problem GRADLE-1556 wurde in 1.0-Meilenstein-8 behoben (Feb 2012)
Verfeinerung über Daniels Antwort:
Nur HTTP-Proxy-Konfiguration
gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128
HTTPS Only Proxy-Konfiguration
gradlew -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129
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
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 = Benutzer -Dhttps.proxyPassword = übergeben -Dhttp.proxyUser = Benutzer -Dhttp.proxyPassword = übergeben
arbeitete für mich (mit gradle.properties
in homedir oder project dir, Build fehlgeschlagen). Vielen Dank, dass Sie das Problem auf gradle verwiesen haben, das diese Problemumgehung gegeben hat.
Update Sie können diese Eigenschaften auch in gradle-wrapper.properties
eingeben (siehe: https://stackoverflow.com/a/50492027/474034 ).
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
In meinem build.gradle
habe ich die folgende Aufgabe, die die üblichen Linux-Proxy-Einstellungen HTTP_PROXY
und HTTPS_PROXY
aus der Shell-Umgebung verwendet:
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
Versuche Folgendes:
gradle -Dhttp.proxyHost=yourProxy -Dhttp.proxyPort=yourPort -Dhttp.proxyUser=usernameProxy -Dhttp.proxyPassword=yourPassoword
Für mich fügt es diese Konfiguration in der Datei gradle.properties des Projekts hinzu, in der sich die Datei build.gradle befindet:
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 Proxy-Servers 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 derselbe
Erstellen Sie im Projektordner eine Datei mit dem Namen gradle.properties
, in der sich die build.gradle
-Datei 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 für Proxy verwenden, fügen Sie es wie systemProp.https.proxyHost=www.proxysite.com
hinzu.
Für IP geben Sie einfach die IP ohne out http://
oder https://
.__ an.
Überprüfen Sie Gradle Official Doc für weitere Details und die Einrichtung von Vertretungen auf globaler Ebene
Basierend auf der Antwort von SourceSimian; Dies funktionierte auf Windows-Domänenbenutzerkonten. Beachten Sie, dass Benutzername keine Domäne enthält.
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
Check out bei 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>
Es gibt zwei Möglichkeiten, Gradle hinter einem Proxy zu verwenden:
(Aus dem Beitrag von Guillaume Berche)
Fügen Sie diese Argumente in Ihrem Gradle-Befehl hinzu:
-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
in gradle.properties
fügen Sie folgende Zeilen hinzu:
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
(Den Ort der gradle.properties
-Datei finden Sie in der offiziellen Dokumentation https://docs.gradle.org/current/userguide/build_environment.html
Ein Update auf @sourcesimians und @ kunal-bs answer, das den Benutzernamen und das Kennwort dynamisch festlegt, wenn dies in den Systemeigenschaften konfiguriert ist.
Im Folgenden werden der Benutzername und das Kennwort festgelegt, falls angegeben, oder nur der Host und der Port hinzugefügt, wenn kein Benutzername und 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:[email protected]: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())
}
}
}
Falls ich versuche, einen Proxy aus dem Android Studio einzurichten, klicken Sie auf Aussehen und Verhalten => Systemeinstellungen => HTTP-Proxy. Aber der Proxy hat nicht geklappt, also klicke ich auf keinen Proxy.
Durch die Überprüfung von NO PROXY wird die Proxy-Einstellung nicht aus der .__ entfernt. gradle.properties (Global). Sie müssen es manuell entfernen.
Also entferne ich alle Eigenschaften, die mit systemProp beginnen, zum Beispiel - systemProp.http.nonProxyHosts = *. Local, localhost
Wenn Sie sich hinter 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 Proxyeinträ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 für mich funktioniert!
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 werden dennoch mit diesem Problem konfrontiert. Normalerweise können Sie die gewünschten Pakete gleichzeitig im Browser herunterladen. Die einzige Lösung, die ich finde: Löschen Sie den Ordner .gradle in Ihrem Profil (nicht im Projekt). Nachdem das Projekt synchronisiert wurde, dauert es lange, aber es wird alles wiederhergestellt.