【问题标题】:Including Hyperic Sigar library within jar while using sbt assembly for Scala project在 Scala 项目中使用 sbt 程序集时在 jar 中包含 Hyperic Sigar 库
【发布时间】:2013-02-04 15:51:59
【问题描述】:

我正在使用 sbt 构建一个 Scala 项目,并使用 sbt-assembly 插件创建一个胖 jar。我可以通过将以下内容添加到 build.sbt 来添加非托管 jar(例如 Sigar jar)。

unmanagedJars in Compile +=
    file("lib/hyperic-sigar-1.6.4/sigar-bin/lib/sigar.jar")

但是,当我尝试运行此程序时,我收到以下错误,因为 *.so 库未包含在 jar 中。

no libsigar-amd64-linux.so in java.library.path
org.hyperic.sigar.SigarException: no libsigar-amd64-linux.so in java.library.path
    at org.hyperic.sigar.Sigar.loadLibrary(Sigar.java:172)
    at org.hyperic.sigar.Sigar.<clinit>(Sigar.java:100)


Exception in thread "main" java.lang.UnsatisfiedLinkError: org.hyperic.sigar.ptql.SigarProcessQuery.create(Ljava/lang/String;)V
    at org.hyperic.sigar.ptql.SigarProcessQuery.create(Native Method)
    at org.hyperic.sigar.ptql.ProcessQueryFactory.getQuery(ProcessQueryFactory.java:66)
    at org.hyperic.sigar.ptql.ProcessFinder.findSingleProcess(ProcessFinder.java:44)

我想要包含的库位于lib/hyperic-sigar-1.6.4/sigar-bin/lib/*.so 中,它们需要链接到 jar 中类路径中的目录。我知道进行这样的映射的唯一方法是:

resourceDirectory in Compile <<=
    baseDirectory{ _ / "lib/hyperic-sigar-1.6.4/sigar-bin/lib" }

这会导致 *.so 库被添加到 jar 的 root,但不是特定目录。如何指定资源映射以从 lib/hyperic-sigar-1.6.4/sigar-bin/lib/*.so 映射到我的 jar 中类路径中的目录?我正在尝试做的事情的术语是什么?

【问题讨论】:

  • 您不使用 "org.fusesource" % "sigar" % "1.6.4" classifier("native") 的任何特殊原因?
  • @OlegYch,我在build.sbt 中改为使用libraryDependencies += "org.fusesource" % "sigar" % "1.6.4",但我仍然遇到同样的错误。

标签: scala sbt sbt-assembly


【解决方案1】:

假设 sigar 确实能够从类路径加载本机库,这应该可以解决问题:

libraryDependencies += "org.fusesource" % "sigar" % "1.6.4" classifier("native") classifier("")

否则,您需要手动将它们从 jar 中解压并提供正确的 java.library.path

【讨论】:

  • 稍后将查看“java.library.path”。谢谢!
猜你喜欢
  • 2017-10-16
  • 2019-09-03
  • 2020-03-29
  • 2015-12-27
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多