如何从代理后台使用sbt?
我如何configurationsbt来使用代理?
例如,我的构build定义需要连接到GitHub,指定http.proxy
, http.proxyPort
, user
和password
连接参数。
我将如何通过这些设置来?
当我在家工作时,是否有简单的方法在代理/非代理设置之间切换?
sbt
尊重HTTP代理设置的常用环境variables:
export JAVA_OPTS="$JAVA_OPTS -Dhttp.proxyHost=yourserver -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password"
( 这当然,假设Unix(Linux / OSX等),在Windows上,你可以像往常一样在Windows中设置相同的环境variables( %JAVA_OPTS%
)。
然后像往常一样运行sbt
:
sbt
在代理/无代理之间切换应该是设置一个小脚本的问题,你可以在需要的时候“啜泣”。
陷阱
- 不要在“服务器”值中包含“http://”
- 请勿将端口包含在“服务器”值中
- 你可能也想包含
https.proxyHost
和https.proxyPort
因为很多东西都是通过https来工作的 - 如果您的代理需要身份validation,请不要打扰尝试,除非它仅使用基本身份validation,因为SBT不支持其他任何操作。 还要注意清除发短信到环境variables的凭据! 一定要使用不会创build跟踪文件的文本编辑方法从您的.bash_history中删除命令(从技术上讲,您应该
shred
或srm
整个文件)。 如果你在Windows上,不要担心,你的安全已经搞砸了,你不能再做任何伤害。
与其他基于JVM的项目通常configuration的方式相比, sbt
以相当标准的方式工作。
sbt实际上是两个“子系统” – 发射器和核心。 它通常是xsbt.boot.Boot
,在核心启动之前被执行,我们都知道这些function(甚至有些)。
因此,关于如何执行HTTP,HTTPS和FTPnetworkingstream量的代理服务器的问题。
以下是可以为任何Java应用程序设置的可用属性的完整列表,其中包括指示Java API通过代理路由通信的可用属性:
- HTTP_PROXY
- http_proxy_user
- http_proxy_pass
- http.proxyHost
- 把http.proxyPort
- http.proxyUser
- http.proxyPassword
将上面的http
replace为https
和ftp
以获取服务的属性列表。
一些sbt
脚本使用JAVA_OPTS
来设置代理设置( -Dhttp.proxyHost
和-Dhttp.proxyPort
,其他(以上列出)。 请参阅Javanetworking和代理 。
某些脚本以自己的方式使用SBT_OPTS
属性, .sbtopts
或(仅在Windows上) %SBT_HOME%\conf\sbtconfig.txt
设置代理configuration。 您可以使用它们专门设置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 -JX pass option -X directly to the java runtime (-J is stripped) -SX 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.
请注意只能在Windows上运行的sbtconfig.txt
。 当你使用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 "$@"
脚本的要点是使用从源代码构build的最新版本的sbt(这就是为什么我使用/Users/jacek/.ivy2/local/org.scala-sbt/sbt-launch/$SBT_LAUNCHER_VERSION-SNAPSHOT/jars/sbt-launch.jar
),并将$SBT_OPTS
属性作为将JVM属性传递给JVM使用的一种手段。
上面的脚本让我可以在MacOS X上的命令行上设置代理,如下所示:
SBT_OPTS="-Dhttp.proxyHost=proxyhost -Dhttp.proxyPort=9999" sbt
正如你所看到的,有很多方法来设置代理sbt,这几乎可以归结为JVM使用代理设置。
我用(这是一个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
对于Windows用户,请input以下命令:
set JAVA_OPTS=-Dhttp.proxySet=true -Dhttp.proxyHost=[Your Proxy server] -Dhttp.proxyPort=8080
在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
提供一个适用于所有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
将XXXXXXXreplace为您的proxyHost,并将YYYYreplace为您的proxyPort。
如果你得到错误“无法find或加载主类”,你需要设置你的JAVA_HOME:
set JAVA_HOME=C:\Progra~1\Java\jdkxxxxxx
在64位窗口上时,请使用:
程序〜1 ='程序文件'
Progra〜2 ='Program Files(x86)'
当我将代理信息添加到%JAVA_OPTS%时,出现错误“-Dhttp.proxyHost = yourserver此时是意外的”。 我把代理信息放在%SBT_OPTS%中,它工作。
添加http和httpsconfiguration:
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"
(httpsconfiguration是必须的,因为许多由sbt库引用的url是https)
事实上,我甚至在两个configuration条目中都有一个额外的设置'http.proxySet'
为'true'
。
我在Lightbend Activator的FAQ部分find了一个有用的项目。 我正在使用Activator,它反过来使用SBT,所以不知道这是否可以帮助用户使用SBT,但是如果您使用像我这样的Activator,并且位于代理之后,请按照“代理服务器后面”部分常问问题:
https://www.lightbend.com/activator/docs
以防内容消失,这里是一个复制粘贴:
在代理之后运行激活器时,需要一些额外的configuration。 首先,打开激活器configuration文件,在〜/ .activator / activatorconfig.txt下的用户主目录中find。 请注意,该文件可能不存在。 添加以下行(每行一个选项):
-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和其他types的连接到存储库。 所以在代理之后,这些协议应该是可用的。
在Windows上的大多数简单情况下,只需将代理参数选项传递给JVM,如下所示:
java -Dhttp.proxyHost=myproxy -Dhttp.proxyPort=8080
那会做的。
但是,如果没有,你应该知道的事情很less:
- 无论您是否正在与存储库进行HTTPS连接。
- 是否已将服务器证书导入到jacery
- 您的代理是否会replace您的服务器证书
首先要解决的问题是,你应该将https代理parameter passing给jvm,如:
java -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=8080 -Djavax.net.ssl.trustStore=${TRUST_STORE_PATH}
要解决第二,你应该导入约。 有很多提示。
为了解决第三,你可能可以考虑使用authentication代理。
为了简化SBT的configuration,它提供了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环境variables:
$launchctl setenv _JAVA_OPTIONS "-Dhttp.proxyHost=192.168.1.54 -Dhttp.proxyPort=9999"
运用
sbt -Dhttp.proxyHost=yourServer-Dhttps.proxyHost=yourServer -Dhttp.proxyPort=yourPort -Dhttps.proxyPort=yourPort
在Ubuntu 15.10 x86_64 x86_64 GNU / Linux下工作。
将您的服务器分别replace为正确的地址,而不分别在Dhttp和Dhttps中使用http://或https://前缀。 请记住避免使用引号。 没有包含在代码行中的usr / pass,只要添加-Dhttp.proxyUser = usr -Dhttp.proxyPassword = pass就可以使用相同的input条件。 谢谢@Jacek Laskowski! 干杯
我发现,从terminal启动IntelliJ IDEA让我连接并通过互联网下载。 要从terminal开始,input:
$ idea