如何配置sbt以使用代理?
例如,我的生成定义需要连接到GitHub上,用于指定连接参数http.proxy
,http.proxyPort
,user
,和password
。
如何将这些设置传递给sbt?
当我在家工作时,是否有一种简单的方法可以在代理/无代理设置之间切换?
Answers:
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.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
是在核心启动具有我们都知道的功能(甚至有些功能)之前执行的。
因此,如何执行sbt就是要如何为HTTP,HTTPS和FTP网络流量设置代理。
以下是可为任何Java应用程序(包括sbt)设置的可用属性的完整列表,这些属性指示Java API通过代理路由通信:
将http
上面的替换为https
和ftp
以获取服务的属性列表。
一些sbt
脚本使用JAVA_OPTS
与设置代理服务器的设置-Dhttp.proxyHost
和-Dhttp.proxyPort
其他(如上所列)之间。请参阅Java网络和代理。
某些脚本使用自己的方式使用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 "$@"
脚本的重点是使用从源(这就是我使用/Users/jacek/.ivy2/local/org.scala-sbt/sbt-launch/$SBT_LAUNCHER_VERSION-SNAPSHOT/jars/sbt-launch.jar
)构建的sbt的最新版本,并带有$SBT_OPTS
属性,以将JVM属性传递给sbt使用的JVM。
上面的脚本使我可以在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(感谢评论)
-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
-下。
sbtopts
文件即可为我工作
我用过(这是一个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位Windows上,请使用:
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 config,因为sbt库引用的许多URL是https)
实际上,我什至还有一个额外的设置 'http.proxySet'
,以'true'
在这两个配置项。
当我将代理信息添加到%JAVA_OPTS%时,出现错误“ -Dhttp.proxyHost =您的服务器此时是意外的”。我将代理信息放入%SBT_OPTS%中,它可以正常工作。
使用
sbt -Dhttp.proxyHost=yourServer-Dhttps.proxyHost=yourServer -Dhttp.proxyPort=yourPort -Dhttps.proxyPort=yourPort
在Ubuntu 15.10 x86_64 x86_64 GNU / Linux中工作。
用正确的地址替换yourServer,分别在Dhttp和Dhttps中没有http://或https://前缀。请记住避免使用引号。代码行中没有包含usr / pass,只需添加-Dhttp.proxyUser = usr -Dhttp.proxyPassword = pass并使用相同的键入条件即可。谢谢@Jacek Laskowski!。干杯
我发现Lightbend Activator的FAQ部分中的一项有用。我正在使用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
如果您使用的是需要身份验证的代理,那么我可以为您提供解决方案:)
如@Faiz上面所述,SBT很难处理需要身份验证的代理。解决方案是,如果您无法按需关闭代理(例如,企业代理),则绕过此身份验证。为此,建议您使用一个鱿鱼代理,并使用用户名和密码对其进行配置,以访问公司代理。请参阅:https : //doc.ubuntu-fr.org/squid然后,您可以设置JAVA_OPTS或SBT_OPTS环境变量,以便SBT连接到您自己的本地鱿鱼代理而不是公司代理:
export JAVA_OPTS =“ -Dhttps.proxyHost =本地主机-Dhttps.proxyPort = 3128 -Dhttp.proxyHost =本地主机-Dhttp.proxyPort = 3128”
(只需在您的bashrc中对此进行c / c,而无需进行任何修改,它应该可以正常工作)。
诀窍在于,Squid代理不需要任何身份验证,并且充当SBT与您的其他代理之间的中介。
如果您在使用此建议时遇到麻烦,请告诉我。
问候,
埃德加
尝试提供代理详细信息作为参数
sbt compile -Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port
如果这不起作用,请尝试使用JAVA_OPTS(非Windows)
export JAVA_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port"
sbt compile
或(Windows)
set JAVA_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port"
sbt compile
如果没有任何效果,则设置SBT_OPTS
(非Windows)
export SBT_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port"'
sbt compile
或(Windows)
set SBT_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port"
sbt compile