Sbt 如何使用API映射链接Java API类?

Sbt 如何使用API映射链接Java API类?,sbt,scaladoc,Sbt,Scaladoc,如何使用apiMappings链接到sbt中的Java类?下面的代码适用于各种依赖项,但我不清楚如何链接到Java标准库类 apiMappings ++= { def findManagedDependency(organization: String, name: String): Option[File] = { (for { entry <- (fullClasspath in Runtime).value ++ (fullClasspath in Test)

如何使用
apiMappings
链接到sbt中的Java类?下面的代码适用于各种依赖项,但我不清楚如何链接到Java标准库类

apiMappings ++= {
  def findManagedDependency(organization: String, name: String): Option[File] = {
    (for {
      entry <- (fullClasspath in Runtime).value ++ (fullClasspath in Test).value
      module <- entry.get(moduleID.key) if module.organization == organization && module.name.startsWith(name)
    } yield entry.data).headOption
  }
  val links = Seq(
    findManagedDependency("org.scala-lang", "scala-library").map(d => d -> url(s"http://www.scala-lang.org/api/$scalaVsn/")),
    findManagedDependency("com.typesafe.akka", "akka-actor").map(d => d -> url(s"http://doc.akka.io/api/akka/$akkaVersion/")),
    findManagedDependency("com.typesafe", "config").map(d => d -> url("http://typesafehub.github.io/config/latest/api/")),
    findManagedDependency("com.fasterxml.jackson.core", "jackson-core").map(d => d -> url("http://fasterxml.github.io/jackson-core/javadoc/2.3.1/")),
    findManagedDependency("io.spray", "spray-http").map(d => d -> url("http://spray.io/documentation/1.1-SNAPSHOT/api/")),
    findManagedDependency("io.spray", "spray-routing").map(d => d -> url("http://spray.io/documentation/1.1-SNAPSHOT/api/")),
    findManagedDependency("org.slf4j", "slf4j-api").map(d => d -> url("http://www.slf4j.org/api/")),
    findManagedDependency("com.typesafe.akka", "akka-testkit").map(d => d -> url(s"http://doc.akka.io/api/akka/$akkaVersion/")),
    findManagedDependency("org.specs2", "specs2").map(d => d -> url(s"http://etorreborre.github.io/specs2/api/SPECS2-$specs2Version/"))
  )
  links.collect { case Some(d) => d }.toMap
}
apiMappings++={
def FindManagedDependence(组织:字符串,名称:字符串):选项[文件]={
(用于{
输入url“http://www.scala-lang.org/api/$scalaVsn/”),
FindManagedDependence(“com.typesafe.akka”,“akka actor”).map(d=>d->url)http://doc.akka.io/api/akka/$akkaVersion/”),
FindManagedDependence(“com.typesafe”,“config”).map(d=>d->url(“http://typesafehub.github.io/config/latest/api/")),
FindManagedDependence(“com.fasterxml.jackson.core”,“jackson core”).map(d=>d->url(“http://fasterxml.github.io/jackson-core/javadoc/2.3.1/")),
FindManagedDependence(“io.spray”,“spray http”).map(d=>d->url(“http://spray.io/documentation/1.1-SNAPSHOT/api/")),
FindManagedDependence(“io.spray”,“spray routing”).map(d=>d->url(“http://spray.io/documentation/1.1-SNAPSHOT/api/")),
FindManagedDependence(“org.slf4j”,“slf4j api”).map(d=>d->url(“http://www.slf4j.org/api/")),
FindManagedDependence(“com.typesafe.akka”,“akka testkit”).map(d=>d->url)http://doc.akka.io/api/akka/$akkaVersion/”),
FindManagedDependence(“org.specs2”、“specs2”).map(d=>d->url)http://etorreborre.github.io/specs2/api/SPECS2-$specs2Version/“”)
)
links.collect{case Some(d)=>d}.toMap
}
使用来自的解决方案,即将以下内容添加到
apiMappings

apiMappings += (
    file("/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar") -> 
    url("http://docs.oracle.com/javase/8/docs/api")
)
fixJavaLinksTask
任务将在
build.sbt
中执行以下操作:

import scala.util.matching.Regex.Match

autoAPIMappings := true

// builds -doc-external-doc
apiMappings += (
    file("/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar") -> 
    url("http://docs.oracle.com/javase/8/docs/api")
)

lazy val fixJavaLinksTask = taskKey[Unit](
    "Fix Java links - replace #java.io.File with ?java/io/File.html"
)

fixJavaLinksTask := {
  println("Fixing Java links")
  val t = (target in (Compile, doc)).value
  (t ** "*.html").get.filter(hasJavadocApiLink).foreach { f => 
    println("fixing " + f)
    val newContent = javadocApiLink.replaceAllIn(IO.read(f), fixJavaLinks)
    IO.write(f, newContent)
  }
}

val fixJavaLinks: Match => String = m =>
    m.group(1) + "?" + m.group(2).replace(".", "/") + ".html"

val javadocApiLink = """\"(http://docs\.oracle\.com/javase/8/docs/api/index\.html)#([^"]*)\"""".r

def hasJavadocApiLink(f: File): Boolean = (javadocApiLink findFirstIn IO.read(f)).nonEmpty

fixJavaLinksTask <<= fixJavaLinksTask triggeredBy (doc in Compile)
导入scala.util.matching.Regex.Match
自动映射:=true
//构建-文档外部文档
apiMappings+=(
文件(“/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar”)->
网址(“http://docs.oracle.com/javase/8/docs/api")
)
lazy val fixJavaLinksTask=任务键[单位](
“修复Java链接-将#Java.io.File替换为?Java/io/File.html”
)
fixJavaLinksTask:={
println(“修复Java链接”)
val t=(目标在(编译,文档)).value
(t**“*.html”).get.filter(hasJavadocApiLink).foreach{f=>
println(“固定”+f)
val newContent=javadocApiLink.replaceAllIn(IO.read(f),fixJavaLinks)
IO.write(f,新内容)
}
}
val fixJavaLinks:Match=>String=m=>
m、 组(1)+“?”+m.group(2).替换为“.”、“/”+”.html”
val javadocApiLink=“”\”(http://docs\.oracle\.com/javase/8/docs/api/index\.html)#([^“]*)\“”
def hasJavadocApiLink(f:File):Boolean=(javadocApiLink findFirstIn IO.read(f)).nonEmpty
fixJavaLinksTask您可以找到我对您所寻找内容的答案


这个答案和这里发布的另一个答案之间的主要区别在于,
rt.jar
的位置是从运行时确定的,而不是硬编码的。

您是想链接Java库还是Scala标准库?如果是Java,这个问题是Scaladoc的重复,基本上不受Scaladoc支持。@EugeneYokota我不是正在尝试链接到标准Java库。在2.11之前,我使用了“-外部URL"它工作得很好,但该选项不再可用。再也没有合法的方法来做这件事了?这似乎…不是最佳的。我对您的用例所需的答案中缺少什么?您能在执行
doc
后执行
last doc
以查看缺少哪些选项,并与不同版本的Scala进行比较吗确实需要更多的输入来处理用例。注意您使用的是大致可以称为“FindManagedDependence模式”的模式,您可能会感兴趣(并且可以重用)。