Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为jar获取常春藤元数据_Java_Scala_Ivy - Fatal编程技术网

Java 为jar获取常春藤元数据

Java 为jar获取常春藤元数据,java,scala,ivy,Java,Scala,Ivy,给定对~/.ivy2/cache中jar的引用,如何获得关于相应常春藤包的常春藤元数据 对于jackson-core-2.5.4.jar,这是我所能做到的。我是用Scala写的,但是Java解决方案也可以。我相信,如果代码中显示的错误已修复,我要查找的答案可能会在返回的ResolveReport中找到 object PoisonIvy extends App { import java.net.URL import java.nio.file.{Path, Paths} import

给定对
~/.ivy2/cache
中jar的引用,如何获得关于相应常春藤包的常春藤元数据

对于
jackson-core-2.5.4.jar
,这是我所能做到的。我是用Scala写的,但是Java解决方案也可以。我相信,如果代码中显示的错误已修复,我要查找的答案可能会在返回的
ResolveReport
中找到

object PoisonIvy extends App {
  import java.net.URL
  import java.nio.file.{Path, Paths}
  import org.apache.commons.io.FileUtils
  import org.apache.ivy.Ivy
  import org.apache.ivy.core.report.ResolveReport
  import org.apache.ivy.core.resolve.ResolveOptions
  import scala.collection.JavaConverters._

  val confs = Array("default")
  val resolveOptions = new ResolveOptions()
    .setDownload(false)
    .setTransitive(true)
    .setConfs(confs)

  val ivy: Ivy = Ivy.newInstance()
  val ivyHome: Path = Paths.get(sys.props.getOrElse("ivy.home", sys.props("user.home") + "/.ivy2"))

  FileUtils.listFiles(ivyHome.toFile, Array("jar"), true).asScala.find { file =>
    file.getName == "jackson-core-2.5.4.jar"
  }.foreach { file =>
    val url: URL = file.toURI.toURL

    // [Fatal Error] jackson-core-2.5.4.jar:1:1: Content is not allowed in prolog.
    val resolveReport2: ResolveReport = ivy.getResolveEngine.resolve(url)
    println(resolveReport2)

    // [Fatal Error] jackson-core-2.5.4.jar:1:1: Content is not allowed in prolog.
    val resolveReport1: ResolveReport = ivy.resolve(url, resolveOptions)
    println(resolveReport1)
  }
}
我在
build.sbt
中使用了这些依赖项:

"org.apache.ivy" % "ivy" % "2.4.0"
"commons-io" % "commons-io" % "2.6" 

我在GitHub上做了一个SBT项目来玩。

只是为了确保我理解了这个问题-你说的是常春藤描述符中的metada(即ivy.xml文件)?@CantleepNow似乎常春藤Java库使用了xml文件中的信息,可能还有其他信息。我展示的代码尝试为~/.ivy2/cache中的每个依赖项获取resolveReport,但失败了。Ivy仅使用Ivy.xmls(描述符),还使用了缓存中的一些属性文件。但是,我仍然不明白您是否需要获取描述符中的信息,或者jar的元数据(如清单)?实际上,我只想将jar与java doc/Scala doc URLOk so javadoc关联。那是艾薇做的。Javadoc首先需要在缓存中,只有在您已经解析了所有类型的工件的情况下才是这样。在ivy.xml中有一个名为type的属性,所以您只需要一个值为javadoc的属性,以确保我理解了这个问题-您正在谈论的是ivy描述符中的metada(即ivy.xml文件)?@cantleep现在看来,ivy Java库使用了xml文件中的信息,可能还有其他信息。我展示的代码尝试为~/.ivy2/cache中的每个依赖项获取resolveReport,但失败了。Ivy仅使用Ivy.xmls(描述符),还使用了缓存中的一些属性文件。但是,我仍然不明白您是否需要获取描述符中的信息,或者jar的元数据(如清单)?实际上,我只想将jar与java doc/Scala doc URLOk so javadoc关联。那是艾薇做的。Javadoc首先需要在缓存中,只有在您已经解析了所有类型的工件的情况下才是这样。在ivy.xml中有一个名为type的属性,所以您只需要一个值为javadoc的属性