我正在使用Maven来构建我的代码,在我的项目pom中.xml,我已经将远程存储库配置为
<repositories>
<repository>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<id>HDPReleases</id>
<name>HDP Releases</name>
<url>http://repo.hortonworks.com/content/repositories/releases/</url>
<layout>default</layout>
</repository>
</repositories>
在Maven设置中.xml我在代理标签下添加了详细信息,以便所有HTTPS请求在下载时使用代理。然后 Maven 无法从远程 hortonworks 存储库获取所需的文件,并失败并出现错误,例如
[ERROR] Failed to execute goal on project flume-sources: Could not resolve dependencies for project com.hdptest:flume-sources:jar:1.0-SNAPSHOT: Failed to collect dependencies at org.apache.flume:flume-ng-core:jar:1.4.0.2.0.10.1-3: Failed to read artifact descriptor for org.apache.flume:flume-ng-core:jar:1.4.0.2.0.10.1-3: Could not transfer artifact org.apache.flume:flume-ng-core:pom:1.4.0.2.0.10.1-3 from/to hortonworks (http://repo.hortonworks.com/content/repositories/releases/): Connect to repo.hortonworks.com:80 [repo.hortonworks.com/54.225.131.199] failed: Connection timed out -> [Help 1]
我可以在这里理解什么是问题。就是每当Maven尝试从 repo.hortonworks.com 下载时,它都不会使用我在设置中提到的代理详细信息.xml因此该请求不起作用。但是当它将相同的请求传递给 Maven 时
通过查看来自 Maven 构建的调试消息可以清楚地看出这一点,如下所示。从 https://repo.maven.apache.org 下载任何内容时,它使用正确的代理详细信息。但是,当要从 hortonworks 的存储库下载任何内容时,使用代理都是失败的。
[DEBUG] =======================================================================
[DEBUG] Using transporter WagonTransporter with priority -1.0 for http://repo.hortonworks.com/content/repositories/releases/
[DEBUG] Using connector BasicRepositoryConnector with priority 0.0 for http://repo.hortonworks.com/content/repositories/releases/
Downloading: http://repo.hortonworks.com/content/repositories/releases/org/apache/flume/flume-ng-core/1.4.0.2.0.10.1-3/flume-ng-core-1.4.0.2.0.10.1-3.pom
[DEBUG] Writing tracking file /root/.m2/repository/org/apache/flume/flume-ng-core/1.4.0.2.0.10.1-3/flume-ng-core-1.4.0.2.0.10.1-3.pom.lastUpdated
[DEBUG] Using transporter WagonTransporter with priority -1.0 for https://repo.maven.apache.org/maven2
[DEBUG] Using connector BasicRepositoryConnector with priority 0.0 for https://repo.maven.apache.org/maven2 via xyzproxy.test.co.in:8080 with username=proxy_user_name, password=***
Downloading: https://repo.maven.apache.org/maven2/org/apache/flume/flume-ng-core/1.4.0.2.0.10.1-3/flume-ng-core-1.4.0.2.0.10.1-3.pom
[DEBUG] Writing tracking file /root/.m2/repository/org/apache/flume/flume-ng-core/1.4.0.2.0.10.1-3/flume-ng-core-1.4.0.2.0.10.1-3.pom.lastUpdated
那么,确保Maven为每个HTTP请求使用给定代理的解决方案是什么?该 HTTP 请求可以是针对项目 pom.xml 中设置的任何存储库。在这里,可以从外部访问HTTP URL,以便存在pom文件。
我尝试在设置中为我的同一 hortonworks 存储库添加镜像.xml因此 Maven 将在查看镜像站点时使用代理详细信息。但这也是行不通的。
<mirror>
<id>hortonworks</id>
<mirrorOf>HDPReleases</mirrorOf>
<name>using Mirror for hortonworks.</name>
<url>http://repo.hortonworks.com/content/repositories/releases/</url>
</mirror>
请注意,我的代理设置是正确的,Maven正在使用它们从 https://repo.maven.apache.org 下载其他文件。如果我从设置文件中删除代理,则会出现明显的错误,即Maven无法连接到存储库。这意味着我使用的是正确的设置.xml文件,并且我的代理设置不正确不是问题。
唯一的问题是 Maven 没有对远程存储库 URL 的 httpsrequests 使用代理。
我可以解决这个问题。我知道这是我的公司代理问题,因此最初我在Maven设置中添加了所有必需的代理详细信息以及用户名和密码.xml。但是,当我们在pom.xml中定义任何存储库时,该设置并未被使用。
因此,对我有用的解决方案是在我的 VM 上设置 CNTLM,然后在设置中指向代理.xml作为本地主机:3128。 之后,来自该虚拟机的任何HTTPS请求都会转到本地主机:3128,我的问题就解决了。
进入 maven 设置.xml会是这样的
<proxies>
<proxy>
<active>true</active>
<protocol>http</protocol>
<host>localhost</host>
<port>3128</port>
<nonProxyHosts>127.0.0.1</nonProxyHosts>
</proxy>
</proxies>