【问题标题】:How to use sbt from behind proxy?如何从代理后面使用 sbt?
【发布时间】:2012-11-28 00:20:49
【问题描述】:

如何配置 sbt 以使用代理?

例如,我的构建定义需要连接到 GitHub,为http.proxyhttp.proxyPortuserpassword 指定连接参数。

我如何将这些设置传递给 sbt?

当我在家工作时,有没有一种简单的方法可以在代理/无代理设置之间切换?

【问题讨论】:

    标签: sbt


    【解决方案1】:

    sbt 尊重 http 代理设置的常用环境变量:

    export JAVA_OPTS="$JAVA_OPTS -Dhttp.proxyHost=yourserver -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password"
    

    当然,假设是 Unix(Linux/OSX 等)。在 Windows 上,您可以像往常一样以 Windows 方式设置相同的环境变量 (%JAVA_OPTS%)。)

    然后照常运行sbt

    sbt
    

    在代理/无代理之间切换应该是设置一个小脚本,您可以在需要时“啜饮”它。

    陷阱

    • 不要在yourserver 值中包含“http://”
    • 不要在yourserver 值中包含端口
    • 您可能还想包含 https.proxyHosthttps.proxyPort,因为很多东西都通过 https 运行
    • 如果您的代理需要身份验证,请不要尝试,除非它只使用基本身份验证,因为 SBT 不支持其他任何东西。还要始终注意将文本凭据明文发送到环境变量中!请务必使用不会创建跟踪文件的文本编辑方法从 .bash_history 中删除命令(从技术上讲,您应该使用shredsrm 整个文件)。如果您使用的是 Windows,请不要担心,您的安全性已经被搞砸了,您不能再造成任何伤害。

    【讨论】:

    • 谢谢,这是正确的答案。原来我真正的问题是我的代理阻止了 GIT 使用的端口,所以我必须使用 http 协议。
    • +1 但是,在 Windows 7 上,我必须在命令提示符下使用 set JAVA_OPTS=-Dhttp.proxyHost=yourserver -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password 才能使其正常工作。
    • 对我不起作用,我不断收到“您的代理需要身份验证”,但它无法 dl deps。我支持旧版 NTLM :(
    • 在我弄清楚之后 - 我意识到在我的情况下我必须使用 HTTPS java 系统参数 -Dhttps.proxyHost -Dhttps.proxyPort
    • 如果您使用的是旧版 NTLM,我建议您使用 CNTLM,它适用于我
    【解决方案2】:

    sbt 的工作方式与其他基于 JVM 的项目通常的配置方式相比相当标准。

    sbt 实际上是两个“子系统”——启动器和核心。通常是 xsbt.boot.Boot 在内核启动之前执行我们都知道(有些甚至喜欢)的功能。

    因此,如何为 HTTP、HTTPS 和 FTP 网络流量设置代理是您如何执行 sbt 的问题。

    以下是可以为任何 Java 应用程序设置的可用属性的完整列表,包括指示 Java API 通过代理路由通信的 sbt:

    • http_proxy
    • http_proxy_user
    • http_proxy_pass
    • http.proxyHost
    • http.proxyPort
    • http.proxyUser
    • http.proxyPassword

    将上面的http 替换为httpsftp 以获取服务的属性列表。

    一些sbt 脚​​本使用JAVA_OPTS 来设置代理设置,其中包括-Dhttp.proxyHost-Dhttp.proxyPort 以及其他(上面列出的)。见Java Networking and Proxies

    有些脚本自带使用SBT_OPTS 属性、.sbtopts 或(仅在Windows 上)%SBT_HOME%\conf\sbtconfig.txt 设置代理配置的自己的方式。您可以使用它们专门设置 sbt 以使用代理,而其他基于 JVM 的应用程序则完全不受影响。

    来自sbt 命令行工具:

    # jvm options and output control
    JAVA_OPTS          environment variable, if unset uses "$java_opts"
    SBT_OPTS           environment variable, if unset uses "$default_sbt_opts"
    .sbtopts           if this file exists in the current directory, it is
                       prepended to the runner args
    /etc/sbt/sbtopts   if this file exists, it is prepended to the runner args
    -Dkey=val          pass -Dkey=val directly to the java runtime
    -J-X               pass option -X directly to the java runtime 
                       (-J is stripped)
    -S-X               add -X to sbt's scalacOptions (-S is stripped)
    

    这里是sbt.bat的摘录:

    @REM Envioronment:
    @REM JAVA_HOME - location of a JDK home dir (mandatory)
    @REM SBT_OPTS  - JVM options (optional)
    @REM Configuration:
    @REM sbtconfig.txt found in the SBT_HOME.
    

    小心sbtconfig.txt,它只适用于Windows。当您使用cygwin 时,不会查询该文件,您将不得不求助于使用其他方法。

    我正在使用带有以下脚本的 sbt:

    $JAVA_HOME/bin/java $SBT_OPTS -jar /Users/jacek/.ivy2/local/org.scala-sbt/sbt-launch/$SBT_LAUNCHER_VERSION-SNAPSHOT/jars/sbt-launch.jar "$@"
    

    脚本的重点是使用从源代码构建的最新版本的 sbt(这就是我使用 /Users/jacek/.ivy2/local/org.scala-sbt/sbt-launch/$SBT_LAUNCHER_VERSION-SNAPSHOT/jars/sbt-launch.jar 的原因)和 $SBT_OPTS 属性作为将 JVM 属性传递给 JVM sbt 使用的一种方式。

    上面的脚本让我可以在 MacOS X 的命令行上设置代理,如下所示:

    SBT_OPTS="-Dhttp.proxyHost=proxyhost -Dhttp.proxyPort=9999" sbt
    

    如您所见,为 sbt 设置代理的方法有很多种,几乎可以归结为为 JVM sbt 使用设置代理。

    【讨论】:

      【解决方案3】:

      在 windows 环境下,只需在 sbt/sbtconfig.txt 中添加以下行

      -Dhttp.proxyHost=PROXYHOST 
      -Dhttp.proxyPort=PROXYPORT 
      -Dhttp.proxyUser=USERNAME 
      -Dhttp.proxyPassword=XXXX
      

      或等效的 Https(感谢 cmets)

      -Dhttps.proxyHost=PROXYHOST 
      -Dhttps.proxyPort=PROXYPORT 
      -Dhttps.proxyUser=USERNAME 
      -Dhttps.proxyPassword=XXXX
      

      【讨论】:

      • 只要我还在 sbtconfig.txt 中添加了具有 https 等效属性的另一行,这对我有用。我使用了与相应 http 属性完全相同的值。因此: -Dhttps.proxyHost=PROXYHOST -Dhttps.proxyPort=PROXYPORT -Dhttps.proxyUser=USERNAME -Dhttps.proxyPassword=XXXX
      • 重要提示:不再起作用!您必须改用sbt/conf/sbtopts 文件。
      • @antoine-sac 在哪里可以找到sbt/conf/sbtopts 文件来设置代理?
      • @krozaine 在 sbt 安装目录中 - 我的在 C:\Program Files (x86)\sbt\conf\sbtopts 下 - 显然是在 Windows 上。
      • @ antoine-sac 我正在运行 Windows 10 和 sbt 1.2.8,实际上我尝试按照建议使用 sbtopts 来执行此操作,但它对我不起作用。涉及 sbtconfig.txt 的解决方案做到了。
      【解决方案4】:

      我用过(这是unix环境):

      export SBT_OPTS="$SBT_OPTS -Dhttp.proxyHost=myproxy-Dhttp.proxyPort=myport"
      

      这对我的设置不起作用:

      export JAVA_OPTS="$JAVA_OPTS -Dhttp.proxyHost=myproxy-Dhttp.proxyPort=myport"
      

      在 sbt.sh 文件中:

      JAVA_OPTS          environment variable, if unset uses "$java_opts"
      SBT_OPTS           environment variable, if unset uses "$default_sbt_opts"
      

      但显然使用的是 SBT_OPTS 而不是 JAVA_OPTS

      【讨论】:

      • 我在 Internet 上找不到我应该将 sbt.sh 文件放在我的项目中的哪个位置!
      • SBT_OPTS ENV 变量是唯一让它在 CentOS 上对我有用的东西
      【解决方案5】:

      对于 Windows 用户,输入以下命令:

      set JAVA_OPTS=-Dhttp.proxySet=true -Dhttp.proxyHost=[Your Proxy server] -Dhttp.proxyPort=8080
      

      【讨论】:

      • 在我的情况下,我还必须为 https 添加设置...code set JAVA_OPTS=-Dhttp.proxySet=true -Dhttp.proxyHost= -Dhttp.proxyPort= -Dhttp.proxyUser= -Dht tp.proxyPassword= -Dhttps.proxySet=true -Dhttps.proxyHost= -Dhttps.proxyPort= -Dhttps.proxyUser= -Dhttp s.proxyPassword= code
      【解决方案6】:

      提供一个适用于所有 Windows 用户的答案:

      将以下内容添加到您的 sbtconfig.txt (C:\Program Files (x86)\sbt\conf)

      -Dhttp.proxyHost=XXXXXXX -Dhttp.proxyPort=YYYY -Dhttp.proxySet=true -Dhttps.proxyHost=XXXXXXX -Dhttps.proxyPort=YYYY -Dhttps.proxySet=true
      

      将两个 XXXXXXX 替换为您的 proxyHost,并将两个 YYYY 替换为您的 proxyPort。

      如果您收到错误“无法找到或加载主类”,您需要设置您的 JAVA_HOME:

      set JAVA_HOME=C:\Progra~1\Java\jdkxxxxxx
      

      在 64 位窗口上,使用:

      Progra~1 = '程序文件'

      Progra~2 = '程序文件(x86)'

      【讨论】:

        【解决方案7】:

        同时添加 http 和 https 配置:

        export JAVA_OPTS="$JAVA_OPTS -Dhttp.proxyHost=yourserver -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password"
        
        export JAVA_OPTS="$JAVA_OPTS -Dhttps.proxyHost=yourserver -Dhttps.proxyPort=8080 -Dhttps.proxyUser=username -Dhttps.proxyPassword=password"
        

        (https 配置是必须的,因为 sbt 库引用的许多 url 都是 https)

        事实上,我什至在两个配置条目中都将'http.proxySet' 设置为'true'

        【讨论】:

          【解决方案8】:

          当我将代理信息添加到 %JAVA_OPTS% 时,我收到一个错误“-Dhttp.proxyHost=yourserver 此时意外”。我将代理信息放在 %SBT_OPTS% 中,它起作用了。

          【讨论】:

          • 在 windows 上我有同样的错误,但设置 SBT_OPTS 更正了错误但没有设置代理。解决方案是设置 JAVA_OPTS 或 SBT_OPTS 但在值周围不加引号。
          【解决方案9】:

          使用

          sbt -Dhttp.proxyHost=yourServer-Dhttps.proxyHost=yourServer -Dhttp.proxyPort=yourPort -Dhttps.proxyPort=yourPort
          

          适用于 Ubuntu 15.10 x86_64 x86_64 GNU/Linux。

          在 Dhttp 和 Dhttps 中分别用不带 http:// 或 https:// 前缀的正确地址替换 yourServer。请记住避免使用引号。代码行中不包含 usr/pass,只需添加 -Dhttp.proxyUser=usr -Dhttp.proxyPassword=pass 并使用相同的输入标准。谢谢@Jacek Laskowski!。 干杯

          【讨论】:

          • 没有一个干净的命令行可以快速复制和粘贴,只有那个@mad 家伙!
          【解决方案10】:

          我在 Lightbend Activator 的常见问题解答部分发现了一个有用的项目。我正在使用 Activator,而后者又使用 SBT,因此不确定这是否有助于仅使用 SBT 的用户,但如果您像我一样使用 Activator,并且在代理之后,请按照“代理背后”部分中的说明进行操作常见问题:

          https://www.lightbend.com/activator/docs

          以防万一内容消失,这里是复制粘贴:

          在代理后面运行激活器时,一些额外的配置 是需要的。首先,打开激活器配置文件,在你的 ~/.activator/activatorconfig.txt 下的用户主目录。注意 此文件可能不存在。添加以下行(每个选项一个 行):

          -Dhttp.proxyHost=PUT YOUR PROXY HOST HERE
          -Dhttp.proxyPort=PUT YOUR PROXY PORT HERE
          -Dhttp.nonProxyHosts="localhost|127.0.0.1"
          -Dhttps.proxyHost=PUT YOUR HTTPS PROXY HOST HERE
          -Dhttps.proxyPort=PUT YOUR HTTPS PROXY PORT HERE
          -Dhttps.nonProxyHosts="localhost|127.0.0.1"
          

          【讨论】:

            【解决方案11】:

            SBT 使用 HTTP/HTTPS/SFTP/SSH 和其他类型的存储库连接。所以当在代理后面时,这些协议应该是可用的。

            在 Windows 上的大多数简单情况下,您只需将代理参数选项传递给 JVM,例如:

            java -Dhttp.proxyHost=myproxy -Dhttp.proxyPort=8080
            

            这样就可以了。

            但如果没有,您应该注意以下几点:

            1. 是否要与存储库建立 HTTPS 连接。
            2. 服务器证书是否已导入 jre cacerts
            3. 您的代理是否会替换您的服务器证书

            首先要解决,你应该将https代理参数传递给jvm,例如:

            java -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=8080 -Djavax.net.ssl.trustStore=${TRUST_STORE_PATH}
            

            要解决第二个问题,您应该导入 ca.有很多技巧。

            要解决第三个问题,您也许可以考虑使用身份验证代理。

            为了简化 SBT 的配置,它在 conf 目录下提供了 sbtconfig.txt 和 sbtops,查看一下。

            参考:
            http://www.scala-sbt.org/0.13/docs/Setup-Notes.html
            http://www.scala-sbt.org/1.0/docs/Publishing.html

            【讨论】:

            • 出现证书问题时会收到什么样的错误消息?当我使用 http 属性时,我会收到一条明确的消息,说我可能在代理后面等。当我切换到 httpS 属性时,我不再有该消息,所以我认为它更好......如此处所述:stackoverflow.com/questions/43464585/…
            【解决方案12】:

            在 Mac OS X / El Capitan 上,您可以设置 java 环境变量:

            $launchctl setenv _JAVA_OPTIONS "-Dhttp.proxyHost=192.168.1.54 -Dhttp.proxyPort=9999"
            

            【讨论】:

              【解决方案13】:

              我发现从终端启动 IntelliJ IDEA 可以让我通过 Internet 连接和下载。要从终端开始,请输入:

              $ idea

              【讨论】:

                【解决方案14】:

                如果您使用需要身份验证的代理,我有一个解决方案:)

                正如@Faiz 上面解释的那样,SBT 很难处理需要身份验证的代理。如果您无法按需关闭代理(例如公司代理),则解决方案是绕过此身份验证。 为此,我建议您使用 squid 代理,并使用您的用户名和密码对其进行配置以访问您的公司代理。见:https://doc.ubuntu-fr.org/squid 然后,您可以设置 JAVA_OPTS 或 SBT_OPTS 环境变量,以便 SBT 连接到您自己的本地 squid 代理而不是您的公司代理:

                export JAVA_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=3128 -Dhttp.proxyHost=localhost -Dhttp.proxyPort=3128"

                (只需在你的 bashrc 中 c/c 这个而不修改任何东西,它应该可以正常工作)。

                诀窍在于 Squid 代理不需要任何身份验证,并且充当 SBT 和您的其他代理之间的中间人。

                如果您在应用此建议时遇到问题,请告诉我。

                问候,

                埃德加

                【讨论】:

                  【解决方案15】:

                  对于那些仍在试图找到在 IntelliJ 中配置 HTTP 代理的位置/方式的人来说,这是我设法让它为我工作的方法。我希望这会有所帮助!

                  (注意:在相应的框中指定您的网络用户名和密码):-

                  【讨论】:

                    【解决方案16】:

                    尝试提供代理详细信息作为参数

                    sbt compile -Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port
                    

                    如果这不起作用,请尝试使用 JAVA_OPTS (非窗户)

                    export JAVA_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port"
                    
                    sbt compile
                    

                    或 (窗口)

                    set JAVA_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port"
                    sbt compile
                    

                    如果没有任何效果,则设置 SBT_OPTS

                    (非窗口)

                    export SBT_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port"'
                    sbt compile
                    

                    或 (窗口)

                    set SBT_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port"
                    sbt compile
                    

                    【讨论】:

                      猜你喜欢
                      • 2015-01-23
                      • 2023-03-31
                      • 2018-08-01
                      • 2011-01-17
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-10-15
                      相关资源
                      最近更新 更多