Konfigurasi proxy gradasi

161

Saya memerlukan akses web dari Gradle melalui server proxy untuk menggunakan integrasi Gradle / Artifactory untuk Jenkins. Untuk mengurangi kemungkinan penyebab masalah, saya secara manual menambahkan plugin Artifactory di build.gradle dan menjalankannya dari baris perintah:

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

Mengikuti deskripsi ini, saya menentukan yang berikut di .gradle / gradle.properties di direktori home saya:

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

Dengan konfigurasi proxy di atas (yang dikenal berfungsi), gagal:

11: 33: 17.699 [GALAT] [org.gradle.BuildExceptionReporter] Disebabkan oleh: java.io.IOException: Server mengembalikan kode respons HTTP: 407 untuk URL: http://gradle.artifactoryonline.com/gradle/plugins/org/ jfrog / buildinfo / build-info-extractor-gradle / 1.0.1 / artifactoryplugin-1.0.1.gradle

Saya memiliki dua server proxy untuk dipilih, dan satu selalu merespons dengan 407( Diperlukan otentikasi proxy ), yang lain dengan 502( Bad gateway ), jadi jelas, opsi proxyHost dan proxyPort digunakan.

Karena nama pengguna (berdasarkan pengguna Active Directory) berisi backslash, saya mencoba keduanya \\dan \, tetapi tidak berhasil. Pengguna yang ditentukan berbeda dari pengguna yang masuk ke mesin dan Direktori Aktif. Kredensial pengguna ini tidak valid untuk proxy, jadi saya harus dapat menentukan pengguna lain.

Pengaturan opsi yang sama di GUI Jenkins atau Artifactory bekerja.

Daniel Beck
sumber
1
memiliki masalah yang sama, tidak ada jawaban di sini yang membantu (bahkan yang mengikuti metode yang sudah usang / tidak usang). kemudian saya menyadari https proxy HARUS ditetapkan: stackoverflow.com/a/27686730/1024839
hkoosha
Anda harus melihat url ini, lebih lengkap dan diperbarui (dengan http dan https): docs.gradle.org/current/userguide/…
Guillaume Husta
@GuillaumeHusta Terima kasih, tetapi harap dicatat pertanyaan ini telah diposting lebih dari 5 tahun yang lalu ketika Gradle 0.8 adalah rilis terbaru, dan dokumentasi tentang hal ini benar-benar salah (lihat tanggapan saya sendiri untuk pertanyaan ini).
Daniel Beck
Saya punya masalah ini ketika menggunakan kutipan dalam proxy, gunakan systemProp.http.proxyHost = xyz bukan systemProp.http.proxyHost = 'xyz'
ir2pid

Jawaban:

211

Perbaikan atas tanggapan Daniel:

Konfigurasi Proxy Hanya HTTP

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

HTTPS Only Proxy configuration

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

Konfigurasi HTTP dan HTTPS Proxy

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

Konfigurasi proxy dengan pengguna dan kata sandi

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

bekerja untuk saya (dengan gradle.propertiesdi homedir atau dir proyek, build masih gagal). Terima kasih telah menunjukkan masalah pada gradle yang memberikan solusi ini. Lihat dokumen rujukan di https://docs.gradle.org/current/userguide/build_environment.html#sec:accessing_the_web_via_a_proxy

Pembaruan Anda juga dapat memasukkan properti ini gradle-wrapper.properties(lihat: https://stackoverflow.com/a/50492027/474034 ).

Guillaume Berche
sumber
4
membantu saya juga ketika menggunakan cntlm
Łukasz Siwiński
5
bagaimana cara Anda menghapus proxy?
Jonathan
2
juga -Dhttps.proxyUser = pengguna -Dhttps.proxyPassword = lulus
Owen B
10
Jika Anda memasukkan properti ke dalam ~/.gradle/gradle.propertiespastikan Anda awalan dengan properti systemProp, seperti misalnyasystemProp.http.proxyHost=127.0.0.1
Stefan Haberl
1
Saya mencoba ini dan tidak berhasil untuk saya. Saya harus mengatur opsi ( -Dhttp.proxyHostdan sejenisnya) sebagai JAVA_OPTSvariabel lingkungan untuk membuatnya berfungsi.
GoldenD
66

Ini properti gradle.prop saya, harap dicatat bagian HTTPS itu

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

Dalam saya, build.gradlesaya memiliki tugas berikut, yang menggunakan pengaturan proxy linux yang biasa, HTTP_PROXYdan HTTPS_PROXY, dari shell 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
SumberSimian
sumber
2
Itu menyenangkan! Ini adalah build.gradle root Anda atau build.gradle aplikasi?
Miao1007
1
Bekerja di Windows 7 juga! Ini harus menjadi jawaban yang diterima!
1
Terima kasih! di atas berfungsi untuk konfigurasi yang tidak memerlukan kata sandi proxy. Saya telah memodifikasinya untuk bekerja dengan atau tanpa kata sandi proxy, lihat di bawah ini
Norbert
if (masukkan map.keySet ()) {
JustAnotherCoder
jawaban Terbaik. semoga ekosistem java berfungsi seperti ini di luar kotak
Avindra Goolcharan
26

Bagi saya, berfungsi menambahkan konfigurasi ini di file gradle.properties proyek, di mana file build.gradle adalah:

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

Di mana: proxyUrl adalah url dari server proxy ( http: // ..... )

proxyPort adalah port (biasanya 8080)

USER adalah pengguna domain saya

Kata sandi, kata sandi saya

Dalam hal ini, proksi untuk http dan https sama

rtrujillor
sumber
23

Coba yang berikut ini:

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

Raphael Vitor
sumber
2
Pertimbangkan kapan pertanyaan ini diajukan. Masalah yang saya tautkan dalam jawaban saya ditandai diselesaikan ke arah Gradle 1.0-tonggak-8 ...
Daniel Beck
2
@Daniel pertanyaan ini adalah hal pertama yang muncul, ketika saya mencari "proksi gradle", saya membaca sepintas lalu dan salah satu yang paling jelas untuk kebutuhan saya ...
Betlista
22

Dengan menggunakan program Java "Request a URL" yang sangat sederhana, saya dapat mereplikasi masalah ini.

http.proxyUserdan http.proxyPasswordtampaknya tidak standar, walaupun populer, karena tidak dijelaskan di halaman referensi Java yang ditautkan dari tutorial Gradle ; meskipun manual Gradle menyebutkannya.

Tampaknya program Java yang ingin mendukung otentikasi proksi perlu melakukan ini secara manual (dan saya dapat melakukan ini menggunakan kode pada halaman yang ditautkan).


Saya mengirimkan masalah ini (dan perbaikan) ke pelacak masalah Gradle . Masalah yang diangkat GRADLE-1556 diselesaikan pada 1.0-milestone-8 (Feb 2012)

Daniel Beck
sumber
Blok tertaut muncul untuk saya sebagai hanya undangan. Apakah ada contoh publik dari solusi ini?
Mike Yockey
@Yock. Lihat lampiran dari masalah yang saya kirimkan ke Gradle, sangat mirip.
Daniel Beck
19

Lihat di c: \ Users \ your username \ .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
sumber
5
@MurrayFoxcroft Di mana Anda melihat tautan dalam jawaban itu?
Max Vollmer
Pada dasarnya tautan ke mesin lokal dan dump file. Tolong jelaskan jawabannya lebih terinci.
Murray Foxcroft
superrrrrr tnx, Anda mungkin tidak menyadari betapa bergunanya posting Anda bagi saya tapi masih besar terima kasih
Seyed Ali Roshan
@SeyedAliRoshan Bagaimana kita bisa melewati proxyUser dan kata sandi dengan argumen? saya tidak ingin menggunakan file globle gradle.propaerties.
Nullpointer
@ Nullpointer, apakah Anda mencoba menggunakan pengaturan proxy di dalam gradle proyek Anda?
Seyed Ali Roshan
12

Buat file yang disebut gradle.propertiesdi dalam folder proyek di mana build.gradlefile itu ada. Tambahkan entri berikut

     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

Jika Anda menggunakan DNS untuk proxy, tambahkan seperti itu systemProp.https.proxyHost=www.proxysite.com

Untuk IP cukup tentukan IP tanpa http://atau https://
Periksa dokumen resmi gradle untuk lebih jelasnya dan mengatur proxy di tingkat global

pengguna2720864
sumber
9

Ada 2 cara untuk menggunakan Gradle di belakang proxy:

Tambahkan argumen di baris perintah

(Dari pos Guillaume Berche)

Tambahkan argumen ini dalam perintah gradle Anda:

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

atau argumen ini jika Anda menggunakan https:

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

Tambahkan baris dalam file konfigurasi gradle

di gradle.properties tambahkan baris berikut:

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

(untuk gradle.propertieslokasi file, silakan merujuk ke dokumentasi resmi https://docs.gradle.org/current/userguide/build_environment.html


EDIT: seperti yang dikatakan oleh @ Joost: Sebuah detail kecil tapi penting yang awalnya saya abaikan: perhatikan bahwa nama host sebenarnya TIDAK mengandung http:// bagian protokol dari URL ...

Thibault
sumber
1
Detail kecil namun penting yang awalnya saya abaikan: perhatikan bahwa nama host sebenarnya TIDAK mengandung http://bagian protokol dari URL ...
Joost
5

Berdasarkan respons SourceSimian; ini bekerja pada akun pengguna domain Windows. Perhatikan bahwa Nama Pengguna tidak termasuk domain,

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.
sumber
Terima kasih! Ada pembaruan tentang cara mendapatkan nama pengguna dan kata sandi proxy secara dinamis di bawah ini
Norbert
2

Dalam kasus saya, saya mencoba mengatur proxy dari studio android Appearance & Behavior => System Settings => HTTP Proxy. Tetapi proxy tidak berhasil jadi saya klik no proxy.

Memeriksa NO PROXY tidak akan menghapus pengaturan proxy dari gradle.properties (Global). Anda harus menghapusnya secara manual.

Jadi saya menghapus semua properti yang dimulai dengan systemProp misalnya - systemProp.http.nonProxyHosts = *. Local, localhost

Anirban
sumber
Saya telah merobek rambut saya selama satu jam, tampaknya di Mac, properti ini ditambahkan secara otomatis ke saya ~/.gradle/gradle.properties. Terima kasih telah menunjukkannya.
EpicPandaForce
1

Pembaruan untuk @sourcesimian dan @ kunal-b's yang secara dinamis menetapkan nama pengguna dan kata sandi jika dikonfigurasi dalam properti sistem.

Berikut ini menetapkan nama pengguna dan kata sandi jika disediakan atau hanya menambahkan host dan porta jika tidak ada nama pengguna dan kata sandi yang ditetapkan.

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
sumber
0

Jika Anda berada di belakang proksi dan menggunakan gerhana, buka Window Menu --> Preferences --> General --> Network Connections . Pilih Penyedia Aktif sebagai 'Manual'.

Di bawah Bagian entri proxy, klik HTTPS, klik Edit dan tambahkan host proxy & port. Jika nama pengguna dan kata sandi diperlukan, berikan juga. Itu berhasil untuk saya!

siapa saya
sumber
0

Jika masalah ini dengan kesalahan HTTP 407 hanya terjadi pada paket yang dipilih maka masalahnya bukan pada pengaturan proxy dan koneksi internet. Anda bahkan dapat mengekspos PC Anda ke internet melalui NAT dan masih akan menghadapi masalah ini. Biasanya pada saat yang sama Anda dapat mengunduh paket yang diinginkan di browser. Satu-satunya solusi yang saya temukan: hapus folder .gradle di profil Anda (bukan di proyek). Setelah menyinkronkan proyek, itu akan memakan waktu lama tetapi mengembalikan semuanya.

Almaz
sumber