如何从代理后面使用 sbt?
Posted
技术标签:
【中文标题】如何从代理后面使用 sbt?【英文标题】:How to use sbt from behind proxy? 【发布时间】:2012-11-28 00:20:49 【问题描述】:如何配置 sbt 以使用代理?
例如,我的构建定义需要连接到 GitHub,为http.proxy
、http.proxyPort
、user
和password
指定连接参数。
我如何将这些设置传递给 sbt?
当我在家工作时,有没有一种简单的方法可以在代理/无代理设置之间切换?
【问题讨论】:
【参考方案1】:sbt
尊重 http 代理设置的常用环境变量:
export JAVA_OPTS="$JAVA_OPTS -Dhttp.proxyHost=yourserver -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password"
(当然,假设是 Unix(Linux/OSX 等)。在 Windows 上,您可以像往常一样以 Windows 方式设置相同的环境变量 (%JAVA_OPTS%
)。)
然后照常运行sbt
:
sbt
在代理/无代理之间切换应该是设置一个小脚本,您可以在需要时“啜饮”它。
陷阱
不要在yourserver
值中包含“http://”
不要在yourserver
值中包含端口
您可能还想包含 https.proxyHost
和 https.proxyPort
,因为很多东西都通过 https 运行
如果您的代理需要身份验证,请不要尝试,除非它只使用基本身份验证,因为 SBT 不支持其他任何东西。还要始终注意将文本凭据明文发送到环境变量中!请务必使用不会创建跟踪文件的文本编辑方法从 .bash_history 中删除命令(从技术上讲,您应该使用shred
或srm
整个文件)。如果您使用的是 Windows,请不要担心,您的安全性已经被搞砸了,您不能再造成任何伤害。
【讨论】:
谢谢,这是正确的答案。原来我真正的问题是我的代理阻止了 GIT 使用的端口,所以我必须使用 http 协议。 +1 但是,在 Windows 7 上,我必须在命令提示符下使用set JAVA_OPTS=-Dhttp.proxyHost=yourserver -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password
才能使其正常工作。
对我不起作用,我不断收到“您的代理需要身份验证”,但它无法 dl deps。我支持旧版 NTLM :(
在我弄清楚之后 - 我意识到在我的情况下我必须使用 HTTPS java 系统参数 -Dhttps.proxyHost
和 -Dhttps.proxyPort
!
如果您使用的是旧版 NTLM,我建议您使用 CNTLM,它适用于我【参考方案2】:
sbt
的工作方式与其他基于 JVM 的项目通常的配置方式相比相当标准。
sbt 实际上是两个“子系统”——启动器和核心。通常是 xsbt.boot.Boot
在内核启动之前执行我们都知道(有些甚至喜欢)的功能。
因此,如何为 HTTP、HTTPS 和 FTP 网络流量设置代理是您如何执行 sbt 的问题。
以下是可以为任何 Java 应用程序设置的可用属性的完整列表,包括指示 Java API 通过代理路由通信的 sbt:
http_proxy http_proxy_user http_proxy_pass http.proxyHost http.proxyPort http.proxyUser http.proxyPassword将上面的http
替换为https
和ftp
以获取服务的属性列表。
一些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.
小心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 "$@"
脚本的重点是使用从源代码构建的最新版本的 sbt(这就是我使用 /Users/jacek/.ivy2/local/org.scala-sbt/sbt-launch/$SBT_LAUNCHER_VERSION-SNAPSHOT/jars/sbt-launch.jar
的原因)和 $SBT_OPTS
属性作为将 JVM 属性传递给 JVM sbt 使用的一种方式。
上面的脚本让我可以在 MacOS X 的命令行上设置代理,如下所示:
SBT_OPTS="-Dhttp.proxyHost=proxyhost -Dhttp.proxyPort=9999" sbt
如您所见,为 sbt 设置代理的方法有很多种,几乎可以归结为为 JVM sbt 使用设置代理。
【讨论】:
【参考方案3】:在 windows 环境下,只需在 sbt/sbtconfig.txt 中添加以下行
-Dhttp.proxyHost=PROXYHOST
-Dhttp.proxyPort=PROXYPORT
-Dhttp.proxyUser=USERNAME
-Dhttp.proxyPassword=XXXX
或等效的 Https(感谢 cmets)
-Dhttps.proxyHost=PROXYHOST
-Dhttps.proxyPort=PROXYPORT
-Dhttps.proxyUser=USERNAME
-Dhttps.proxyPassword=XXXX
【讨论】:
只要我还在 sbtconfig.txt 中添加了具有 https 等效属性的另一行,这对我有用。我使用了与相应 http 属性完全相同的值。因此: -Dhttps.proxyHost=PROXYHOST -Dhttps.proxyPort=PROXYPORT -Dhttps.proxyUser=USERNAME -Dhttps.proxyPassword=XXXX 重要提示:不再起作用!您必须改用sbt/conf/sbtopts
文件。
@antoine-sac 在哪里可以找到sbt/conf/sbtopts
文件来设置代理?
@krozaine 在 sbt 安装目录中 - 我的在 C:\Program Files (x86)\sbt\conf\sbtopts
下 - 显然是在 Windows 上。
@ antoine-sac 我正在运行 Windows 10 和 sbt 1.2.8,实际上我尝试按照建议使用 sbtopts 来执行此操作,但它对我不起作用。涉及 sbtconfig.txt 的解决方案做到了。【参考方案4】:
我用过(这是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
文件放在我的项目中的哪个位置!
SBT_OPTS ENV 变量是唯一让它在 CentOS 上对我有用的东西【参考方案5】:
对于 Windows 用户,输入以下命令:
set JAVA_OPTS=-Dhttp.proxySet=true -Dhttp.proxyHost=[Your Proxy server] -Dhttp.proxyPort=8080
【讨论】:
在我的情况下,我还必须为 https 添加设置...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
【参考方案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 位窗口上,使用:
Progra~1 = '程序文件'
Progra~2 = '程序文件(x86)'
【讨论】:
【参考方案7】:同时添加 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 配置是必须的,因为 sbt 库引用的许多 url 都是 https)
事实上,我什至在两个配置条目中都将'http.proxySet'
设置为'true'
。
【讨论】:
【参考方案8】:当我将代理信息添加到 %JAVA_OPTS% 时,我收到一个错误“-Dhttp.proxyHost=yourserver 此时意外”。我将代理信息放在 %SBT_OPTS% 中,它起作用了。
【讨论】:
在 windows 上我有同样的错误,但设置 SBT_OPTS 更正了错误但没有设置代理。解决方案是设置 JAVA_OPTS 或 SBT_OPTS 但在值周围不加引号。【参考方案9】:使用
sbt -Dhttp.proxyHost=yourServer-Dhttps.proxyHost=yourServer -Dhttp.proxyPort=yourPort -Dhttps.proxyPort=yourPort
适用于 Ubuntu 15.10 x86_64 x86_64 GNU/Linux。
在 Dhttp 和 Dhttps 中分别用不带 http:// 或 https:// 前缀的正确地址替换 yourServer。请记住避免使用引号。代码行中不包含 usr/pass,只需添加 -Dhttp.proxyUser=usr -Dhttp.proxyPassword=pass 并使用相同的输入标准。谢谢@Jacek Laskowski!。 干杯
【讨论】:
没有一个干净的命令行可以快速复制和粘贴,只有那个@mad 家伙!【参考方案10】:我在 Lightbend Activator 的常见问题解答部分发现了一个有用的项目。我正在使用 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"
【讨论】:
【参考方案11】:SBT 使用 HTTP/HTTPS/SFTP/SSH 和其他类型的存储库连接。所以当在代理后面时,这些协议应该是可用的。
在 Windows 上的大多数简单情况下,您只需将代理参数选项传递给 JVM,例如:
java -Dhttp.proxyHost=myproxy -Dhttp.proxyPort=8080
这样就可以了。
但如果没有,您应该注意以下几点:
-
是否要与存储库建立 HTTPS 连接。
服务器证书是否已导入 jre cacerts
您的代理是否会替换您的服务器证书
首先要解决,你应该将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.htmlhttp://www.scala-sbt.org/1.0/docs/Publishing.html
【讨论】:
出现证书问题时会收到什么样的错误消息?当我使用 http 属性时,我会收到一条明确的消息,说我可能在代理后面等。当我切换到 httpS 属性时,我不再有该消息,所以我认为它更好......如此处所述:***.com/questions/43464585/…【参考方案12】:在 Mac OS X / El Capitan 上,您可以设置 java 环境变量:
$launchctl setenv _JAVA_OPTIONS "-Dhttp.proxyHost=192.168.1.54 -Dhttp.proxyPort=9999"
【讨论】:
【参考方案13】:我发现从终端启动 IntelliJ IDEA 可以让我通过 Internet 连接和下载。要从终端开始,请输入:
$ idea
【讨论】:
【参考方案14】:如果您使用需要身份验证的代理,我有一个解决方案:)
正如@Faiz 上面解释的那样,SBT 很难处理需要身份验证的代理。如果您无法按需关闭代理(例如公司代理),则解决方案是绕过此身份验证。 为此,我建议您使用 squid 代理,并使用您的用户名和密码对其进行配置以访问您的公司代理。见:https://doc.ubuntu-fr.org/squid 然后,您可以设置 JAVA_OPTS 或 SBT_OPTS 环境变量,以便 SBT 连接到您自己的本地 squid 代理而不是您的公司代理:
export JAVA_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=3128 -Dhttp.proxyHost=localhost -Dhttp.proxyPort=3128"
(只需在你的 bashrc 中 c/c 这个而不修改任何东西,它应该可以正常工作)。
诀窍在于 Squid 代理不需要任何身份验证,并且充当 SBT 和您的其他代理之间的中间人。
如果您在应用此建议时遇到问题,请告诉我。
问候,
埃德加
【讨论】:
【参考方案15】:对于那些仍在试图找到在 IntelliJ 中配置 HTTP 代理的位置/方式的人来说,这是我设法让它为我工作的方法。我希望这会有所帮助!
(注意:在相应的框中指定您的网络用户名和密码):-
【讨论】:
【参考方案16】:尝试提供代理详细信息作为参数
sbt compile -Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port
如果这不起作用,请尝试使用 JAVA_OPTS (非窗户)
export JAVA_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port"
sbt compile
或 (窗口)
set JAVA_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port"
sbt compile
如果没有任何效果,则设置 SBT_OPTS
(非窗口)
export SBT_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port"'
sbt compile
或 (窗口)
set SBT_OPTS = "-Dhttps.proxyHost=localhost -Dhttps.proxyPort=port -Dhttp.proxyHost=localhost -Dhttp.proxyPort=port"
sbt compile
【讨论】:
以上是关于如何从代理后面使用 sbt?的主要内容,如果未能解决你的问题,请参考以下文章
无法让 SBT 从 Artifactory Pro 公司代理后面下载自己
如何让 sbt 使用本地 Maven 代理存储库(Nexus)?