在jar中包含Hyperic Sigar库,同时为Scala项目使用sbt程序集

时间:2013-02-19 20:08:31

标签: scala sbt sbt-assembly

我正在用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")

但是,当我尝试运行它时,我收到以下错误,因为jar中没有包含*.so库。

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中类路径中的目录?我正在尝试做什么的术语是什么?

1 个答案:

答案 0 :(得分:4)

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

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

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