Cấu hình proxy cấp


159

Tôi cần truy cập web từ Gradle thông qua một máy chủ proxy để sử dụng tích hợp Gradle / Artifactory cho Jenkins. Để giảm các nguyên nhân có thể gây ra sự cố, tôi thêm thủ công plugin Artifactory trong build.gradle và chạy nó từ dòng lệnh:

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

Theo mô tả này, tôi đã chỉ định như sau trong .gradle / gradle.properations trong thư mục nhà của tôi:

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

Với cấu hình proxy ở trên (được biết là hoạt động khác), nó không thành công:

11: 33: 17.699 [ERROR] [org.gradle.BuildExceptionReporter] Nguyên nhân bởi: java.io.IOException: Máy chủ trả về mã phản hồi HTTP: 407 cho URL: http://gradle.artifactoryonline.com/gradle/plugins/org/ jfrog / buildinfo / build-information-extractor-gradle / 1.0.1 / artifactoryplugin-1.0.1.gradle

Tôi có hai máy chủ proxy để chọn và một máy chủ luôn phản hồi với 407( Yêu cầu xác thực proxy ), máy chủ còn lại có 502( Cổng xấu ), vì vậy, rõ ràng, các tùy chọn proxyhost và proxyPort được sử dụng.

Vì tên người dùng (dựa trên người dùng Active Directory) có dấu gạch chéo ngược, tôi đã thử cả hai \\\nhưng không hoạt động. Người dùng được chỉ định khác với người dùng đã đăng nhập vào máy và Active Directory. Thông tin đăng nhập của người dùng này không hợp lệ cho proxy, vì vậy tôi cần có thể chỉ định một người dùng khác.

Thiết lập các tùy chọn tương tự trong GUI của Jenkins hoặc Artifactory đã hoạt động.


1
có cùng một vấn đề, không có câu trả lời nào ở đây có ích (ngay cả những câu trả lời theo phương pháp không dùng nữa / không dùng nữa). sau đó tôi nhận ra proxy https PHẢI được đặt: stackoverflow.com/a/27686730/1024839
hkoosha

Bạn nên xem url này, đầy đủ và cập nhật hơn (với http và https): docs.gradle.org/civerse/userguide/iêu
Guillaume Husta

@GuillaumeHusta Cảm ơn, nhưng xin lưu ý câu hỏi này đã được đăng cách đây hơn 5 năm khi Gradle 0.8 là bản phát hành mới nhất và tài liệu về điều này hoàn toàn sai (xem phản hồi của riêng tôi cho câu hỏi này).
Daniel Beck

Tôi gặp vấn đề này khi sử dụng dấu ngoặc kép trong proxy, sử dụng systemProp.http.proxyhost = xyz chứ không phải systemProp.http.proxyhost = 'xyz'
ir2pid

Câu trả lời:


211

Sàng lọc phản ứng của Daniel:

Cấu hình proxy chỉ HTTP

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

Cấu hình proxy chỉ HTTPS

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

Cả cấu hình HTTP và 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"

Cấu hình proxy với người dùng và mật khẩu

gradlew -Dhttp.proxyhost = 127.0.0.1 -Dhttp.proxyPort = 3128 - Dhttps.proxyhost = 127.0.0.1 -Dhttps.proxyPort = 3129 -Dhttps.proxyUser = user -Dhttps.proxyPass = user proxyPassword = pass -Dhttp.nonProxyhosts = host1.com | host2.com

làm việc cho tôi (với gradle.propertieshomedir hoặc dir dự án, việc xây dựng vẫn thất bại). Cảm ơn đã chỉ ra vấn đề ở cấp độ đã đưa ra cách giải quyết này. Xem tài liệu tham khảo tại https://docs.gradle.org/civerse/userguide/build_envir.html#sec:accessing_the_web_via_a_proxy

Cập nhật Bạn cũng có thể đặt các thuộc tính này vào gradle-wrapper.properties(xem: https://stackoverflow.com/a/50492027/474034 ).


4
cũng giúp tôi khi sử dụng cntlm
ukasz Siwiński

5
Làm thế nào để bạn loại bỏ proxy?
Jonathan

2
cũng -Dhttps.proxyUser = user -Dhttps.proxyPassword = pass
Owen B

10
Nếu bạn đặt các thuộc tính để ~/.gradle/gradle.propertiesđảm bảo bạn đặt tiền tố cho các thuộc tính systemProp, ví dụ nhưsystemProp.http.proxyHost=127.0.0.1
Stefan Haberl

1
Tôi đã thử điều này và không làm việc cho tôi. Tôi đã phải đặt các tùy chọn ( -Dhttp.proxyHostvà lượt thích) làm JAVA_OPTSbiến môi trường để làm cho nó hoạt động.
GoldenD

66

Đây là gradle.properations của tôi, xin lưu ý những phần HTTPS đó

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

55

Trong tôi build.gradlecó tác vụ sau, sử dụng các cài đặt proxy linux thông thường HTTP_PROXYHTTPS_PROXYtừ 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

2
Nó vui! Đó là build.gradle hoặc ứng dụng build.gradle gốc của bạn?
Miao1007

1
Hoạt động trên Windows 7 là tốt! Đây phải là câu trả lời được chấp nhận!

1
Cảm ơn! ở trên làm việc cho cấu hình không cần mật khẩu proxy. Tôi đã sửa đổi nó để hoạt động với hoặc mật khẩu proxy xem bên dưới
Norbert

if (key in map.keySet ()) {
JustAntherCoder

câu trả lời tốt nhất. chúc hệ sinh thái java hoạt động như thế này
Avindra Goolcharan

26

Đối với tôi, công việc thêm cấu hình này trong tệp gradle.properIES của dự án, trong đó tệp build.gradle là:

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

Trong đó: proxyUrl là url của máy chủ proxy ( http: // ..... )

proxyPort là cổng (thường là 8080)

NGƯỜI DÙNG là người dùng tên miền của tôi

PASSWORD, mật khẩu của tôi

Trong trường hợp này, proxy cho http và https là như nhau


23

Hãy thử như sau:

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


2
Hãy xem xét khi câu hỏi này được hỏi. Vấn đề tôi liên kết đến trong câu trả lời của mình đã được giải quyết rõ ràng đối với Gradle 1.0-mốc-8
Daniel Beck

2
@Daniel câu hỏi này là điều đầu tiên xuất hiện, khi tôi tìm kiếm "proxy lớp", tôi đã đọc lướt các câu trả lời và đó là câu hỏi rõ ràng nhất cho nhu cầu của tôi ...
Betlista

22

Sử dụng chương trình Java "Yêu cầu URL" rất đơn giản, tôi có thể sao chép vấn đề.

http.proxyUserhttp.proxyPassworddường như là không chuẩn, mặc dù phổ biến, các tùy chọn, vì chúng không được mô tả trong trang tham chiếu Java được liên kết từ hướng dẫn Gradle ; mặc dù hướng dẫn Gradle đề cập đến chúng.

Có vẻ như các chương trình Java muốn hỗ trợ xác thực proxy cần phải thực hiện việc này một cách thủ công (và tôi đã có thể thực hiện việc này bằng cách sử dụng mã trên trang được liên kết).


Tôi đã gửi vấn đề này (và một bản sửa lỗi) cho trình theo dõi vấn đề Gradle . Vấn đề lớn lên GRADLE-1556 đã được giải quyết trong 1.0-mốc-8 (tháng 2 năm 2012)


Khối liên kết đến với tôi chỉ là lời mời. Có một ví dụ công khai của cách giải quyết này?
Mike Y Racer

@yock Xem tệp đính kèm của vấn đề tôi đã gửi cho Gradle, nó rất giống nhau.
Daniel Beck

19

Kiểm tra tại c: \ Users \ tên người dùng của bạn \ .gradle \ gradle.properies:

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
@M bồFoxcroft Bạn thấy một liên kết trong câu trả lời đó ở đâu?
Max Vollmer

Về cơ bản là một liên kết đến máy cục bộ và kết xuất tệp. Hãy mô tả câu trả lời chi tiết hơn.
Murray Foxcroft

superrrrrr tnx, bạn có thể không nhận ra bài đăng của bạn hữu ích như thế nào đối với tôi nhưng vẫn cảm ơn rất nhiều
Seyed Ali Roshan

@SeyedAliRoshan Làm thế nào chúng ta có thể vượt qua proxyUser và mật khẩu bằng đối số? tôi không muốn sử dụng tập tin gradle.propaerties hả hê.
Nullpulum

@Nullpulum bạn đã thử sử dụng cài đặt proxy bên trong lớp của dự án của bạn chưa?
Seyed Ali Roshan

12

Tạo một tệp được gọi gradle.propertiestrong thư mục dự án nơi build.gradletệp có mặt. Thêm mục sau

     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

Nếu bạn đang sử dụng DNS cho proxy thì hãy thêm nó vào systemProp.https.proxyHost=www.proxysite.com

Đối với IP, chỉ cần xác định IP không có http://hoặc https://
Kiểm tra tài liệu chính thức của lớp để biết thêm chi tiết và thiết lập proxy ở cấp độ toàn cầu


9

Có 2 cách để sử dụng Gradle đằng sau proxy:

Thêm đối số trong dòng lệnh

(Từ bài của Guillaume Berche)

Thêm các đối số này trong lệnh gradle của bạn:

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

hoặc những đối số này nếu bạn đang sử dụng https:

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

Thêm dòng trong tập tin cấu hình gradle

trong gradle.properties thêm những dòng sau đây:

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

(đối với gradle.propertiesvị trí tệp, vui lòng tham khảo tài liệu chính thức https://docs.gradle.org/civerse/userguide/build_en môi.html


EDIT: như đã nói bởi @Joost: Một chi tiết nhỏ nhưng quan trọng mà ban đầu tôi đã bỏ qua: lưu ý rằng tên máy chủ thực tế KHÔNG chứa http:// phần giao thức của URL ...


1
Một chi tiết nhỏ nhưng quan trọng mà ban đầu tôi đã bỏ qua: lưu ý rằng tên máy chủ thực tế KHÔNG chứa http://phần giao thức của URL ...
Joost

5

Dựa trên phản hồi của SourceSimian; điều này làm việc trên tài khoản người dùng miền Windows. Lưu ý rằng Tên người dùng không có tên miền,

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

Cảm ơn! Có một bản cập nhật về cách lấy tên người dùng và mật khẩu proxy một cách linh hoạt bên dưới
Norbert

1

Một bản cập nhật cho @sourceimian@ kunal-b's câu trả lời trong đó tự động đặt tên người dùng và mật khẩu nếu được định cấu hình trong thuộc tính hệ thống.

Sau đây đặt tên người dùng và mật khẩu nếu được cung cấp hoặc chỉ thêm máy chủ và cổng nếu không có tên người dùng và mật khẩu được đặt.

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())
        }
    }
}

1

Trong trường hợp của tôi, tôi cố gắng thiết lập proxy từ studio android Giao diện & Hành vi => Cài đặt hệ thống => Proxy HTTP. Nhưng proxy không hoạt động nên tôi không bấm proxy.

Kiểm tra NO PROXY sẽ không xóa cài đặt proxy khỏi gradle.properIES (Toàn cầu). Bạn cần phải tự gỡ bỏ nó.

Vì vậy, tôi loại bỏ tất cả các thuộc tính bắt đầu với systemProp chẳng hạn - systemProp.http.nonProxyhosts = *. Local, localhost


Tôi đã xé tóc ra trong một giờ, rõ ràng trên Mac, các thuộc tính này được tự động thêm vào ~/.gradle/gradle.properties. Cảm ơn đã chỉ ra điều đó.
EpicPandaForce

0

Nếu bạn đứng sau proxy và sử dụng nhật thực, hãy đến Window Menu --> Preferences --> General --> Network Connections. Chọn Nhà cung cấp hoạt động làm 'Hướng dẫn'.

Trong phần mục Proxy, nhấp vào HTTPS, nhấp Chỉnh sửa và thêm cổng & máy chủ proxy. Nếu tên người dùng và mật khẩu là bắt buộc, hãy cung cấp cho nó. Nó làm việc cho tôi!


0

Nếu sự cố này xảy ra với lỗi HTTP 407 chỉ xảy ra với các gói được chọn thì sự cố không nằm ở cài đặt proxy và kết nối internet. Bạn thậm chí có thể đưa PC của bạn lên internet thông qua NAT và vẫn sẽ phải đối mặt với vấn đề này. Thông thường, cùng lúc bạn có thể tải xuống các gói mong muốn trong trình duyệt. Giải pháp duy nhất tôi tìm thấy: xóa thư mục .gradle trong hồ sơ của bạn (không phải trong dự án). Sau khi đồng bộ hóa dự án, sẽ mất nhiều thời gian nhưng khôi phục lại mọi thứ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.