简而言之,我在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文件加载信息,从而导致与上面相同的问题。
有没有人试过这样做?或者有人对此有什么想法/建议吗?
谢谢
1条答案
按热度按时间enyaitl31#
我想你可以选择第一种,稍微改变一下。在你的
build.sbt
文件声明从jarList
:然后将其添加到
libraryDependencies
:记得吗
build.sbt
包含纯scala代码,可能只有很少的限制(比如有导致Unit
,例如呼叫foreach
,不允许)。所以知道某些声明的类型(libraryDependencies
有类型SettingKey[Seq[ModuleID]]
)应该有助于增加更多的魔力。