【发布时间】:2012-11-28 00:20:49
【问题描述】:
如何配置 sbt 以使用代理?
例如,我的构建定义需要连接到 GitHub,为http.proxy、http.proxyPort、user 和password 指定连接参数。
我如何将这些设置传递给 sbt?
当我在家工作时,有没有一种简单的方法可以在代理/无代理设置之间切换?
【问题讨论】:
标签: sbt
如何配置 sbt 以使用代理?
例如,我的构建定义需要连接到 GitHub,为http.proxy、http.proxyPort、user 和password 指定连接参数。
我如何将这些设置传递给 sbt?
当我在家工作时,有没有一种简单的方法可以在代理/无代理设置之间切换?
【问题讨论】:
标签: sbt
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.proxyHost 和 https.proxyPort,因为很多东西都通过 https 运行shred 或srm 整个文件)。如果您使用的是 Windows,请不要担心,您的安全性已经被搞砸了,您不能再造成任何伤害。【讨论】:
set JAVA_OPTS=-Dhttp.proxyHost=yourserver -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password 才能使其正常工作。
-Dhttps.proxyHost 和 -Dhttps.proxyPort!
sbt 的工作方式与其他基于 JVM 的项目通常的配置方式相比相当标准。
sbt 实际上是两个“子系统”——启动器和核心。通常是 xsbt.boot.Boot 在内核启动之前执行我们都知道(有些甚至喜欢)的功能。
因此,如何为 HTTP、HTTPS 和 FTP 网络流量设置代理是您如何执行 sbt 的问题。
以下是可以为任何 Java 应用程序设置的可用属性的完整列表,包括指示 Java API 通过代理路由通信的 sbt:
将上面的http 替换为https 和ftp 以获取服务的属性列表。
一些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 使用设置代理。
【讨论】:
在 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
【讨论】:
sbt/conf/sbtopts 文件。
sbt/conf/sbtopts 文件来设置代理?
C:\Program Files (x86)\sbt\conf\sbtopts 下 - 显然是在 Windows 上。
我用过(这是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
【讨论】:
sbt.sh 文件放在我的项目中的哪个位置!
对于 Windows 用户,输入以下命令:
set JAVA_OPTS=-Dhttp.proxySet=true -Dhttp.proxyHost=[Your Proxy server] -Dhttp.proxyPort=8080
【讨论】:
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
提供一个适用于所有 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)'
【讨论】:
同时添加 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'。
【讨论】:
当我将代理信息添加到 %JAVA_OPTS% 时,我收到一个错误“-Dhttp.proxyHost=yourserver 此时意外”。我将代理信息放在 %SBT_OPTS% 中,它起作用了。
【讨论】:
使用
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!。 干杯
【讨论】:
我在 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"
【讨论】:
SBT 使用 HTTP/HTTPS/SFTP/SSH 和其他类型的存储库连接。所以当在代理后面时,这些协议应该是可用的。
在 Windows 上的大多数简单情况下,您只需将代理参数选项传递给 JVM,例如:
java -Dhttp.proxyHost=myproxy -Dhttp.proxyPort=8080
这样就可以了。
但如果没有,您应该注意以下几点:
首先要解决,你应该将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
【讨论】:
在 Mac OS X / El Capitan 上,您可以设置 java 环境变量:
$launchctl setenv _JAVA_OPTIONS "-Dhttp.proxyHost=192.168.1.54 -Dhttp.proxyPort=9999"
【讨论】:
我发现从终端启动 IntelliJ IDEA 可以让我通过 Internet 连接和下载。要从终端开始,请输入:
$ idea
【讨论】:
如果您使用需要身份验证的代理,我有一个解决方案:)
正如@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 和您的其他代理之间的中间人。
如果您在应用此建议时遇到问题,请告诉我。
问候,
埃德加
【讨论】:
尝试提供代理详细信息作为参数
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
【讨论】: