如何从代理后台使用sbt?

我如何configurationsbt来使用代理?

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

我将如何通过这些设置来?

当我在家工作时,是否有简单的方法在代理/非代理设置之间切换?

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.proxyHosthttps.proxyPort因为很多东西都是通过https来工作的
  • 如果您的代理需要身份validation,请不要打扰尝试,除非它仅使用基本身份validation,因为SBT不支持其他任何操作。 还要注意清除发短信到环境variables的凭据! 一定要使用不会创build跟踪文件的文本编辑方法从您的.bash_history中删除命令(从技术上讲,您应该shredsrm整个文件)。 如果你在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

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

一些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:

  1. 无论您是否正在与存储库进行HTTPS连接。
  2. 是否已将服务器证书导入到jacery
  3. 您的代理是否会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