Maven cung cấp một phương thức tích hợp sẵn để thực hiện việc này, thông qua một tệp có tên là settings.xml và điều này đã được đề cập trong các câu trả lời khác. Tuy nhiên, theo thông lệ, đặc biệt là trong Linux, các công cụ dòng lệnh sẽ tự động sử dụng proxy được chỉ định bởi biến môi trườnghttps_proxy
.
Để tuân thủ nguyên tắc Đừng lặp lại chính mình (nhằm giúp bạn tránh những sai lầm), thật tuyệt nếu mvn
có thể tự động làm việc với điều đó.
Đây là tập lệnh shell thực hiện các chuyển đổi cần thiết:
#! /usr/bin/env bash
function javaproxy {
## using "Shell Parameter Expansion"
request_scheme=$1 ; proxy=$2
notscheme=$(echo ${proxy#*://}) ## parse
scheme=$(echo ${proxy%${notscheme}}) ## remove
scheme=$(echo ${scheme%://}) ## strip
hostport=$(echo ${proxy#*//*}) ## parse
host=$(echo ${hostport%:*}) ## parse
port=$(echo ${hostport#${host}}) ## remove
port=$(echo ${port#:}) ## strip
scheme=$(echo ${scheme:-http}) ## default
host=$(echo ${host:-localhost}) ## default
port=$(echo ${port:-8080}) ## default
echo -n " -D${request_scheme}.proxyHost=${host}"
echo -n " -D${request_scheme}.proxyPort=${port}"
}
JTO=""
if [ $http_proxy ] ; then
JTO="${JTO}$(javaproxy http ${http_proxy})"
fi
if [ $https_proxy ] ; then
JTO="${JTO}$(javaproxy https ${https_proxy})"
fi
if [ $no_proxy ] ; then
JTO="${JTO} -Dhttp.nonProxyHosts=$(echo \"${no_proxy}\"|tr ',' '|')"
fi
export JAVA_TOOL_OPTIONS=${JTO}
echo "JAVA_TOOL_OPTIONS=${JAVA_TOOL_OPTIONS}"
mvn_friendliness_options+=--update-snapshots
mvn ${mvn_friendliness_options} $@
Bạn có thể đặt tên này là một cái gì đó giống như proxied_mvn
và chạy nó như sau:
$ https_proxy=http://localhost:58080 ./proxied_mvn clean package
Ngoài ra, bạn chỉ có thể di chuyển thiết lập môi trường vào tập lệnh khởi động của mình.
vấn đề
Có nhiều điều có thể sai khi cố gắng định cấu hình Maven để truy cập vào Nexus thông qua proxy. Hy vọng, kịch bản này sẽ giúp với một số vấn đề khó khăn nhất, nhưng những vấn đề khác vẫn còn:
Thông tin đăng nhập Nexus có sẵn và chính xác (chỉ khi được yêu cầu)
Kiểm tra với mvn help:effective-settings
Bộ nhớ đệm Maven: "độ phân giải sẽ không được đánh dấu lại"
mvn clean package --update-snapshots
Đầu ra văn bản của Maven - bạn phải xem xét kỹ đầu ra để đảm bảo các thông báo lỗi không khác biệt tinh tế giữa các lần chạy
Các phiên bản cũ hơn của Java có thể yêu cầu _JAVA_OPTIONS
thay vì JAVA_TOOL_OPTIONS
.
kết thúc
Có nhiều loại Proxy . Tương ứng, có nhiều hơn một cách mà câu hỏi này đã được diễn giải - góp phần vào số lượng lớn các câu trả lời khác nhau ở đây.
Tôi đã giải quyết rõ ràng trường hợp máy chủ proxy web (HTTP / HTTPS) chuyển tiếp , được sử dụng để truy cập internet từ trong mạng công ty (đối với một số công ty). Điều này có thể khác biệt đáng chú ý với proxy SOCKS , cũng đã được giải quyết trong một số câu trả lời ở đây.
Nhân tiện, vì nó sử dụng JAVA_TOOL_OPTIONS
, các giải pháp này cũng có thể được áp dụng để chạy các ứng dụng Java khác của bạn bên trong một proxy .
Gợi ý chia tay ... Ví dụ của tôi ở trên sử dụng http://localhost:58080
. Điều này là do tôi đã thiết lập chuyển tiếp cổng từ CLIENT_PROXY=localhost:58080
proxy của tôi sang proxy mạng thực tế bằng cách sử dụng WSL trên máy khách truy cập từ xa của tôi để chạy:
ssh $PROXY_CLIENT -R $CLIENT_PROXY:$SERVER_PROXY