如何从 Play 中删除所有默认解析器!应用?

Posted

技术标签:

【中文标题】如何从 Play 中删除所有默认解析器!应用?【英文标题】:How to remove all default resolvers from a Play! application? 【发布时间】:2013-07-03 16:03:42 【问题描述】:

背景:我们公司有几个Play!应用程序,它们的测试在我们的内部 CI 中运行。每个 Play 应用程序都通过 http 从各种公共存储库中检索依赖项。这并不理想(它绕过了我们内部的 Nexus 存储库)但可以忍受。现在我们正在添加额外的 CI 容量,并且不希望让新机器能够访问防火墙之外。

在示例 Play 应用中,project/Build.scala 中的以下配置不足以阻止构建转到 repo.typesafe.comrepo1.maven.org

sbtResolver := "Typesafe (proxy)" at "http://repo-1/nexus/content/repositories/typesafe-releases/"

resolvers := Seq(
  "Maven Central (proxy)" at "http://repo-1/nexus/content/repositories/central/",
  "Typesafe (proxy)" at "http://repo-1/nexus/content/repositories/typesafe-releases/",
  // some more internal Nexus repositories
)

externalResolvers := Seq.empty

repo-1 是我们的内部 Nexus 主机,它代理 Maven Central、Typesafe 和其他存储库)

当我从 Maven Central(例如 Guava)或 Typesafe 的存储库(例如 Play mailer 插件)中删除一些依赖项并运行 play compile 时,我从输出中看到仍在从 @987654328 检索依赖项@和repo1.maven.org

[info] downloading http://repo.typesafe.com/typesafe/releases/com/typesafe/play-plugins-mailer_2.9.1/2.0.2/play-plugins-mailer_2.9.1-2.0.2.jar ...
[info]  [SUCCESSFUL ] com.typesafe#play-plugins-mailer_2.9.1;2.0.2!play-plugins-mailer_2.9.1.jar (981ms)
[info] downloading http://repo1.maven.org/maven2/com/google/guava/guava/12.0/guava-12.0.jar ...
[info]  [SUCCESSFUL ] com.google.guava#guava;12.0!guava.jar (1422ms)

为了使问题更加复杂,我们还使用了所有版本的稍旧版本:Scala 2.9.1、Play 2.0.1、sbt 0.11.3。


如何强制 Play 应用仅从内部存储库中检索依赖项?

【问题讨论】:

(SBT) How to disable default resolver and only use the company internal resolver?的可能重复 【参考方案1】:

原来答案是使用正确的sbt 语法。

问题中列出的代码正在为构建生成配置,但没有在任何地方分配它。我相信:= 替换了resolvers 键的全局配置,但事实并非如此。

将以下内容放入 project/Build.scala 会强制 Play 应用解决来自我们内部 Nexus 的依赖项:

val nexusResolvers = resolvers := Seq(
  "Maven Central (proxy)" at "http://repo-1/nexus/content/repositories/central/",
  "Typesafe (proxy)" at "http://repo-1/nexus/content/repositories/typesafe-releases/",
  // some more internal Nexus repositories
)

注意将resolvers :=的结果分配给一个新的val,然后将其添加到同一文件中的项目设置中:

val main = PlayProject(...)
  .settings(nexusResolvers: _*)

另外,去掉了配置中的sbtResolverexternalResolvers 部分,它们没有任何效果。

【讨论】:

【参考方案2】:

编辑或创建 /home/YOUR_HOME/.sbt/repositories 添加以下内容:

[repositories] local my-maven-proxy-releases: http://nexus_domain_or_ip:8081/nexus/content/groups/public/

运行播放时添加此参数: -Dsbt.override.build.repos=true

例如:激活器运行 -Dsbt.override.build.repos=true

这会阻止 play 加载项目配置中定义的存储库。

详情请见this。

【讨论】:

这是一个比我自己更好的答案。使用这种方法,项目构建文件中的存储库列表可以保持“真实”,指向真正的存储库。然后,个人可以根据自己的代理存储库选择覆盖。 我在学习Logam时尝试过这种方法,不幸的是它不起作用。我不明白为什么 sbt 不像 Gradle 那样容易支持 Maven 设置。

以上是关于如何从 Play 中删除所有默认解析器!应用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Play 2.7 for Scala 中编写一个通用 JSON 解析器来验证入站请求?

你如何防止 yaml-cpp 解析器删除所有注释?

$application.home 如何在 play 框架的 conf/logback.xml 中解析?

DOM 解析器:仅删除某些属性

名片解析器。如何从名片识别文本中提取相关信息?

在 AWS 解析器映射模板中,是不是有任何方法可以从对象中删除字段?