【问题标题】:Gradle, not working behind proxy with NTLM on WindowsGradle,不能在 Windows 上的 NTLM 代理后面工作
【发布时间】:2013-01-21 07:27:16
【问题描述】:

我只是在测试一个 gradle(这个领域的绝对菜鸟)。

我正在 Windows 机器上尝试这个。我曾经让 Maven 从同一台机器上为我进行构建和发布。它位于具有 NTLM 身份验证的代理后面。而这曾经工作得很好。然而,不知何故,Gradle 并没有为我这样做。

我的 build.gradle 有以下配置(除了其他)

// Java plugin to build our JAR artifact.
apply plugin: 'java'  

// Build stuff with jdk 1.7
sourceCompatibility = 1.7
targetCompatibility = 1.7

// Regular name and version for your project. 
group = 'foo.bar.gradle'
version = '1.0-SNAPSHOT'

// The local maven repository
def localMavenRepo = 'file://C:/ProgramFiles/MavenRepository'

repositories {
// Use the maven central repository. 
mavenCentral()
// ... and the local maven repository.
maven { url localMavenRepo }

// maven { url 'http://www.springsource.com/repository/' }
}


dependencies {
compile 'org.databene:contiperf:2.2.0','org.springframework:spring-webmvc:3.2.0.RELEASE'         
testCompile 'junit:junit:4.11' 
/*compile.exclude module: 'commons'*/
/*all*.exclude*/ 
}

我的 /gradle.properties 有以下设置

systemProp.proxySet=true
systemProp.http.proxyHost=<proxy name, same as that set in Maven>
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=<domain name>/<user name> 

但是,当我运行它时,我收到以下错误

NEGOTIATE authentication error: No valid credentials provided (Mechanism level:
No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
)

这是在 Gradle 的 1.3 版中。请帮忙。

更新: 我现在已经更新到 gradle-1.4-rc-3 我的 gradle.properties 文件现在看起来像这样

systemProp.proxySet="true"
systemProp.http.keepAlive="true"
systemProp.http.proxyHost=<proxy name> 
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=<domain name>/<username> 

但我仍然看到这个问题。我还有一些日志。我在 STS (IDE) 中看到了这个

Could not GET 'http://repo1.maven.org/maven2/org/spr...'. Received status code 500 from server: Internal Server Error 
Could not execute build using Gradle installation 'C:\ProgramFiles\gradle-1.4-rc-3'.

不,凭据没有错。在相同的设置中,具有相同值的 Maven 工作正常。不, gradle.properties 也在正确的位置。如果我更改代理的值,则错误会更改。因此,该工具肯定是在读取 gradle.properties 文件。

【问题讨论】:

  • 您解决了这个问题吗?我面临同样的问题。我在代理后面,我使用 Gradle 2.3
  • 你能解决这个问题吗?我也面临同样的情况!
  • 见下方 Mannfred Berndtgen 的回答。除了让 cntlm 启动并运行并让 http.proxyHost、http.proxyPort 指向它(如上所述)之外,您还需要让 HTTPS 等效项(https.proxyHost、https.proxyPort)指向同一个 cntlm 实例。

标签: java gradle


【解决方案1】:

更新:

随着时间的推移,更好的解决方案:

添加 wagon-http-lightweight 扩展 Wagon HTTP 轻量级库在使用 NTLM 代理时处理 Maven 3 中的身份验证限制。

从 maven repo 下载 wagon-http-lightweight-2.2.jar。 将 wagon-http-lightweight-2.2.jar 复制到 %M2_HOME%/lib/ext 文件夹。

原答案:

我遇到了完全相同的问题。这是微软服务器(ISA 等)的常见问题。 NTLM(至少,直接)不支持您的应用程序中使用的 http 标头
为了绕过这个,我使用了“代理到代理”。一个本地代理,它将动态更改 http 标头,以便 Microsoft 服务器可以理解您的请求。

基本上您将在本地 (127.0.0.1) 发送您的请求,此代理服务器将使用符合 NTLM 的请求更改标头并将其转发到 8080 端口上的父代理。

两种情况:您是否拥有管理员权限。

如果你有管理员权限,你可以安装CNTLM 它将作为服务安装。有一个“自动配置”安装,你可以在 CNTLM 的 wiki 上查看(默认端口:3128)

如果您没有管理员权限,则可以安装 NTLM APS(尽管它很旧,但对我有用)
您需要使用您的 NT 域、主机、父代理 + 端口、NTLM_TO_BASIC 1 配置 server.cfg 文件 (您可以通过按键盘上的“windows + pause”按钮来获取您的域和主机) 默认端口是 5865。

对于 NTLMAPS,您需要 Python(python 便携版不需要管理员权限,并更改“runserver.bat”中的值以匹配您的安装) 你还需要用this patch 修补sourceforge 上的版本,因为它有一个bug with chunked responses

在您的应用程序中,您需要按如下方式更改您的代理设置:

systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=3128 or 5865 depending on which server you installed

有时 microsoft 服务器仍会阻止请求,我需要重新启动本地代理或更改父代理地址。

【讨论】:

  • 好的。那是新的,我以前没有发现过。但是,正如您所知,我使用完全相同的盒子、完全相同的用户、使用完全相同的代理和用户设置的 Maven。这样可行。而这并没有。你还会说“代理到代理”是值得研究的东西吗?
  • 我实际上在 Maven 和我的工件服务器上遇到了同样的问题。所以很奇怪,它对所有软件的行为都应该相同,即使有时,我的 Maven 可以通过代理,但它是随机的。不久前我在网上找到了这个解决方案,并把我的笔记发给了你。但我刚刚又找到了来源:docs.codehaus.org/display/MAVENUSER/… 这是一个快速且易于实施的解决方案,所以是的,值得一试。
  • 太棒了,您的更新帮助我解决了我困扰了 2 天的问题。
  • @Rigg802 您能否详细说明:如果我需要让 gradle 与 NTLM 代理一起使用,我应该将 JAR 放到 %M2_HOME%/lib/ext 中,对吗?即使我没有安装 maven,gradle 也会自动使用该文件夹中的库?
【解决方案2】:

这是一个相当古老的问题,但在谷歌搜索“gradle”和“ntlm proxy”时仍然是第一个热门问题。关于它的文档不多,但如果 gradle 抱怨类似

无法 GET 'https://jcenter.bintray.com/org/slf4j/...

如果您使用 cntlm 作为代理,那么此命令行可能会有所帮助:

gradle test -DproxySet=true -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3128

(假设代理名称和端口的默认值)。注意“https”设置。使用这些设置成功完成了丢失的下载。

【讨论】:

    【解决方案3】:

    这对我有用,我使用的是 gradle-6.3。将以下内容放在 gradle.properties 中

    请注意,我们通常在登录 Windows 机器时提供 domain-name\user-name,但要提供的值将是 domain-name/user-name。此外,您的密码不需要是十六进制编码,如果您的密码包含“等于”字符,gradle 会选择所有值“之后”第一个“=”(从左侧)作为您的密码。

    systemProp.http.proxyHost=proxy-ip-or-name
    systemProp.http.proxyPort=proxy-port 
    systemProp.http.proxyUser=domain-name/user-name 
    systemProp.http.proxyPassword=your-password-without-any-encoding
    
    systemProp.https.proxyHost=proxy-ip-or-name 
    systemProp.https.proxyPort=proxy-port 
    systemProp.https.proxyUser=domain-name/user-name 
    systemProp.https.proxyPassword=your-password-without-any-encoding
    

    【讨论】:

    • 这应该是公认的答案,它是唯一真正适用于最新版本 gradle 的东西吗?
    【解决方案4】:

    我记得过去在 NTLM 代理后面工作。当我们在 *nix 机器上工作时,我们不能使用 NTLM 代理,因为这些操作系统不支持它。我也不认为 Gradle 支持 NTLM,但我可能错了。

    不管怎样,我们当时使用的是 (cntlm)[http://cntlm.sourceforge.net/] 代理,你可以做同样的事情。只需在您的机器上进行设置,然后将 Gradle 的代理设置指向它即可。

    编辑:显然我错了 - Gradle 支持 NTLM 身份验证,请参阅release notes for 1.0-milestone-8

    【讨论】:

    • 谢谢@erdi。是的,我已经看到了那一点文档,但它仍然不能在我的最终工作,尽管 Maven 在相同的基础设施中使用相同的设置工作得很好。我还通过forums.gradle.org/gradle/topics/… 向 Gradle 人提出了一张票。
    【解决方案5】:

    Gradle 依赖 Apache HttpClient + jcifs 来进行 NTLM 身份验证。

    HttpClient 4.2.1 和 4.2.2 中存在一个可能导致问题的错误:您可以尝试 2 个选项。

    • 升级到Gradle 1.4-rc-3 或更高版本,其中包含针对此问题的bugfix。
    • 在您的gradle.properties 文件中包含systemProp.http.keepAlive="true"。

    【讨论】:

    • 感谢@daz deboer 的回复。但我仍然面临同样的问题。请参阅问题中的更新。
    【解决方案6】:

    看到您的 maven 存储库位于 C:\ProgramFiles 下,而不是典型的可写位置,例如用户目录中

    %USERPROFILE%\.m2\repository || ~/.m2/repository 
    

    您的错误可能是 Windows 权限错误...确保检查您的 Windows 日志和/或尝试将您的存储库移动到传统位置...

    【讨论】:

    • @partha 抱歉,NTLM 的 jira 上有一个错误 :: GRADLE-2639
    【解决方案7】:

    我能够修补 Gradle 核心 v1.10 以使用 BASIC 而不是 NTLM,并且它在我们的环境中工作。

    如果你想试试,jar 文件是here

    使用风险自负。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 2017-02-07
      • 2018-01-09
      • 2017-07-19
      • 1970-01-01
      相关资源
      最近更新 更多