java—在sbt构建中添加托管库依赖项列表(任意长度)

n3ipq98p  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(414)

简而言之,我在scala中编写了一个工具,它从本地目录中存储的jar生成jar列表,解析给定的repo,标识与每个本地jar匹配的groupid,并输出所有必要的信息以在sbt中使用。我希望能够解析运行时确定的依赖项列表(否则这是无用的),以便在为hadoop构建更复杂的应用程序时从本质上自动化更新过程,并测试不同构建和条件下的程序兼容性。
一句话:我还没有找到一个解决方案,可以将在构建中发现的库依赖项传递给构建。

我尝试过的一些事情:

1) 在for循环中使用关键字
我在/project目录中生成了带有dependencies.scala代码的jarlist,并将其添加到了my build.sbt中

jarList.foreach(x => 
libraryDependencies += x.GroupID % x.ArtifactID % x.Revision
)

2) 手动编辑build.sbt,方法是在my/project/dependencies.scala文件中运行类似的操作,将找到的每个librarydependency追加到build.sbt文件底部的一行

import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.BufferedWriter;
import java.io.IOException;

try{
  val file =new File(new 
File(".").getAbsolutePath().toString.replaceAll("^(.*)\\.(.*)$","$1$2")++"build.sbt")
  if(!file.exists()){
    file.createNewFile()
                    }
  val fw = new FileWriter(file,true)
  val bw = new BufferedWriter(fw)
  val pw = new PrintWriter(bw)
  pw.println(s"""libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "2.7.3" """.stripMargin)
  pw.close();

  println("Data successfully appended at the end of file")
}catch {
  case ioe: IOException => println("Exception occurred:")
  ioe.printStackTrace()
}

这个选项可以正常工作(如果我完全停止并重新启动构建)
3) 在另一个构建之前加载/运行一个sbt构建,问题是sbt似乎总是从每个build.sbt文件加载信息,从而导致与上面相同的问题。
有没有人试过这样做?或者有人对此有什么想法/建议吗?
谢谢

enyaitl3

enyaitl31#

我想你可以选择第一种,稍微改变一下。在你的 build.sbt 文件声明从 jarList :

lazy val jarDependencies: Seq[ModuleID] = jarList.map(x => x.GroupID % x.ArtifactID % x.Revision)

然后将其添加到 libraryDependencies :

libraryDependencies ++= jarDependencies

记得吗 build.sbt 包含纯scala代码,可能只有很少的限制(比如有导致 Unit ,例如呼叫 foreach ,不允许)。所以知道某些声明的类型( libraryDependencies 有类型 SettingKey[Seq[ModuleID]] )应该有助于增加更多的魔力。

相关问题