如何从代理后面使用sbt?


85

如何配置sbt以使用代理?

例如,我的生成定义需要连接到GitHub上,用于指定连接参数http.proxyhttp.proxyPortuser,和password

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

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

Answers:


135

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.proxyHosthttps.proxyPort因为很多东西都可以通过https进行操作
  • 如果您的代理服务器需要身份验证,则不要再尝试尝试,除非它仅使用基本身份验证,因为SBT不支持其他任何功能。另外,请始终注意将清晰的短信凭证放入环境变量中!确保使用不会创建跟踪文件的文本编辑方法从.bash_history中删除命令(从技术上来说,您应该shredsrm整个文件)。如果您使用的是Windows,请不必担心,因为安全性已一团糟,您无法再造成任何伤害。

1
谢谢,这是正确的答案。原来我的真正问题是我的代理服务器阻止了GIT使用的端口,因此我必须使用http协议。
supyo 2012年

4
+1但是,在Windows 7上,我必须使用Command Prompt使它set JAVA_OPTS=-Dhttp.proxyHost=yourserver -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password起作用。
HeatfanJohn

4
对我不起作用,我不断收到“您的代理需要身份验证”,并且无法进行dl deps。我落后于旧版NTLM :(
samthebest 2014年

6
在弄清楚之后-我意识到我必须使用HTTPS java系统参数-Dhttps.proxyHost -Dhttps.proxyPort
ConnyKreyßel2015年

1
如果你是一个传统的NTLM后面,我使用推荐CNTLM,它为我的作品
Elouan Keryell,即使

25

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

sbt实际上是两个“子系统”-启动器和核心。通常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网络和代理

某些脚本使用自己的方式使用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使用的代理。


13

在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中添加具有https等效属性的另一行,这对我就可以使用。我使用与相应的http属性完全相同的值。因此:-Dhttps.proxyHost = PROXYHOST -Dhttps.proxyPort = PROXYPORT -Dhttps.proxyUser = USERNAME -Dhttps.proxyPassword = XXXX
snark

4
重要提示:不再起作用!您必须改为使用该 sbt/conf/sbtopts文件。
asachet

@ antoine-sac在哪里可以找到sbt/conf/sbtopts设置代理的文件?
krozaine

1
在Windows上,sbt安装目录中的@krozaine-我的在C:\Program Files (x86)\sbt\conf\sbtopts-下。
asachet

@ antoine-sac似乎无需修改sbtopts文件即可为我工作
enissay

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


我在Internet上找不到应该sbt.sh在我的项目中放置文件的位置!
hadilq

SBT_OPTS ENV变量是唯一使它在CentOS上对我有用的东西
Icarus

9

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

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

3
就我而言,我还必须添加https的设置... codeset 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
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 ='程序文件'

Progra〜2 ='程序文件(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"

(必须使用https config,因为sbt库引用的许多URL是https)

实际上,我什至还有一个额外的设置 'http.proxySet',以'true'在这两个配置项。


3

当我将代理信息添加到%JAVA_OPTS%时,出现错误“ -Dhttp.proxyHost =您的服务器此时是意外的”。我将代理信息放入%SBT_OPTS%中,它可以正常工作。


6
在Windows上,我有相同的错误,但设置SBT_OPTS可更正该错误,但未设置代理。解决的办法是设置JAVA_OPTS或SBT_OPTS,但在该值前后不要加上引号。
pgras 2013年

2

使用

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!。干杯


没有地方是可以快速复制和粘贴的干净命令行,只是那个@mad guy!
user278049'1

2

我发现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"

2

SBT同时使用HTTP / HTTPS / SFTP / SSH和其他与存储库的连接。因此,当使用代理时,这些协议应该可用。

在Windows上的大多数简单情况下,您只需要将代理参数选项传递给JVM,例如:

java -Dhttp.proxyHost=myproxy -Dhttp.proxyPort=8080

这样就可以了。

但是,如果没有,您应该注意的几件事:

  1. 是否与存储库建立HTTPS连接。
  2. 是否将服务器证书导入到jre cacerts
  3. 您的代理是否将替换您的服务器证书

首先解决,您应该将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


如果是证书问题,您会收到哪种错误消息?当我使用http属性时,会收到一条清晰的消息,提示我可能在代理后面,等等。当我切换到httpS属性时,我不再有该消息,因此我认为这会更好...但是我遇到了问题如下所述:stackoverflow.com/questions/43464585/...
文森特˚F

1

在Mac OS X / El Capitan上,您可以设置Java环境变量:

$launchctl setenv _JAVA_OPTIONS "-Dhttp.proxyHost=192.168.1.54 -Dhttp.proxyPort=9999"

1

我发现从终端启动IntelliJ IDEA可以连接并通过Internet下载。要从终端启动,请输入:

$ idea


0

如果您使用的是需要身份验证的代理,那么我可以为您提供解决方案:)

如@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与您的其他代理之间的中介。

如果您在使用此建议时遇到麻烦,请告诉我。

问候,

埃德加


0

对于仍在尝试在IntelliJ中配置HTTP代理的位置/方式的人,这就是我设法使其工作的方法。我希望这有帮助!

(注意:在相应的框中指定您的网络用户名和密码):-

在此处输入图片说明


0

尝试提供代理详细信息作为参数

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.