如何在代理后使用sbt?

89

如何配置sbt使用代理?

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

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

是否有一种简单的方法在我在家工作时轻松切换代理/无代理设置?

16个回答

141

sbt 尊重常见的用于设置 HTTP 代理的环境变量:

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

(假设你正在使用Unix(Linux / OSX等),当然,如果你在Windows上,你也可以像平常一样设置相同的环境变量(%JAVA_OPTS%),只是以Windows的方式进行。)

然后像往常一样运行sbt

sbt

在代理和不使用代理之间切换应该是设置一个小脚本,每当需要时就可以“吞下”它。

注意事项

  • 不要在yourserver的值中包含"http://"
  • 不要在yourserver的值中包含端口号
  • 如果有很多东西都是通过https工作的,您可能还想包括https.proxyHosthttps.proxyPort
  • 如果您的代理需要身份验证,请不要尝试除了使用基本身份验证以外的任何内容,因为SBT不支持其他任何内容。 另外,一定要小心明文传输凭据到环境变量中!请确保使用不会创建跟踪文件的文本编辑方法从您的.bash_history中删除命令(技术上应该使用 shred srm 整个文件)。 如果您使用的是Windows,则不必担心,您的安全性已经被破坏,您无法造成更多的损害。

1
谢谢,这是正确的答案。事实证明我的真正问题是我的代理阻止了GIT使用的端口,所以我必须使用http协议。 - supyo
4
然而,在Windows 7上,我必须使用命令提示符中的set JAVA_OPTS=-Dhttp.proxyHost=yourserver -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password才能使此项工作。 - HeatfanJohn
4
对我没用,一直显示“您的代理需要身份验证”,无法下载依赖项。我在使用旧版 NTLM 代理。 - samthebest
6
在我弄清楚后,我意识到在我的情况下我必须使用HTTPS Java系统参数-Dhttps.proxyHost-Dhttps.proxyPort - Conny Kreyßel
1
如果你使用的是旧版 NTLM,我建议使用 CNTLM,它对我来说很有效。 - Elouan Keryell-Even
显示剩余4条评论

26

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

sbt实际上是两个“子系统”——launcher和core。通常在core启动带有我们所知道的特性(甚至一些人喜欢的特性)之前,会执行xsbt.boot.Boot

因此,如何执行sbt决定了如何设置HTTP、HTTPS和FTP网络流量的代理。

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

  • 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.

使用 cygwin 时,要小心只在 Windows 系统上有效的 sbtconfig.txt。如果该文件未被使用,则需要采用其他方法。

我正在使用以下脚本来运行 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属性传递给sbt使用的JVM的手段。

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

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

正如你所看到的,有许多设置代理服务器的方法可以应用于sbt,但基本上都归结为为JVM设置sbt使用的代理服务器。


14
在Windows环境中,只需在sbt/sbtconfig.txt文件中添加以下行。
-Dhttp.proxyHost=PROXYHOST 
-Dhttp.proxyPort=PROXYPORT 
-Dhttp.proxyUser=USERNAME 
-Dhttp.proxyPassword=XXXX

或 HTTPS 等价物(感谢评论)

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

3
只要我在sbtconfig.txt中添加了与http等效的属性行,这个方法对我有效。我使用了与相应http属性完全相同的值。因此: -Dhttps.proxyHost=PROXYHOST -Dhttps.proxyPort=PROXYPORT -Dhttps.proxyUser=USERNAME -Dhttps.proxyPassword=XXXX - snark
5
重要提示:不再起作用!你需要使用sbt/conf/sbtopts文件代替。 - asachet
@antoine-sac,我在哪里可以找到sbt/conf/sbtopts文件来设置代理? - krozaine
1
@sbt安装目录下的@krozaine - 我的是在C:\Program Files (x86)\sbt\conf\sbtopts下 - 在Windows上显然。 - asachet
@antoine-sac,看起来对我来说可以正常工作,而不需要触碰sbtopts文件。 - enissay
1
@antoine-sac 我正在运行 Windows 10 和 sbt 1.2.8,并尝试按建议使用 sbtopts 进行操作,但对我无效。涉及 sbtconfig.txt 的解决方案有效。 - Yeikel

12

我使用的是(这是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文件放在项目的哪个位置! - hadilq
SBT_OPTS环境变量是我在CentOS上使其工作的唯一方法。 - Icarus

10

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

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

3
在我的情况下,我不得不添加https的设置... code set JAVA_OPTS=-Dhttp.proxySet=true -Dhttp.proxyHost=<代理服务器> -Dhttp.proxyPort=<端口号> -Dhttp.proxyUser=<用户名> -Dhttp.proxyPassword=<密码> -Dhttps.proxySet=true -Dhttps.proxyHost=<代理服务器> -Dhttps.proxyPort=<端口号> -Dhttps.proxyUser=<用户名> -Dhttps.proxyPassword=<密码> code - Arun

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位Windows上使用时,请使用以下内容:

Progra~1 =“Program Files”

Progra~2 =“Program Files(x86)”


4

同时添加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"

(由于许多被sbt库引用的url是https,因此必须进行https配置)

事实上,我甚至在两个配置条目中都有一个额外的设置'http.proxySet''true'


3
当我把代理信息添加到%JAVA_OPTS%中时,出现了一个错误:“-Dhttp.proxyHost=yourserver在这个时间是意外的”。我把代理信息放到了%SBT_OPTS%中,然后它就可以工作了。

6
在Windows上我遇到了同样的错误,但是设置SBT_OPTS可以纠正错误,但没有设置代理。解决方案是设置JAVA_OPTS或SBT_OPTS,但不要在值周围加引号。 - pgras

2
我在Lightbend Activator的FAQ部分找到了一篇有用的文章。我正在使用Activator,它又使用SBT,所以不确定这是否对只使用SBT的用户有帮助,但如果像我一样使用Activator并且在代理后面,请遵循FAQ中“Behind A Proxy”部分中的说明:https://www.lightbend.com/activator/docs
以防万一内容消失,这里是复制粘贴的内容:
当在代理后面运行activator时,需要进行一些额外的配置。首先,打开activator配置文件,该文件位于您的用户主目录下的~/.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"

2

使用

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

适用于Ubuntu 15.10 x86_64 x86_64 GNU/Linux。

在Dhttp和Dhttps中分别替换yourServer为正确的地址,不要包含http://或https://前缀。记得避免使用引号。代码行中不包括usr/pass,如果要包括,请按照相同的输入法添加-Dhttp.proxyUser=usr -Dhttp.proxyPassword=pass。感谢@Jacek Laskowski!祝福。


没有任何干净的命令行可以快速复制和粘贴,只有那个@疯子! - user278049

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接