2013-02-19 21 views
6

Tôi đang xây dựng một dự án Scala với sbt và tạo một bình chất béo với plugin sbt-assembly. Tôi có thể thêm các lọ không được quản lý (chẳng hạn như lọ Sigar) bằng cách thêm các mục sau vào build.sbt.Bao gồm thư viện Hyperic Sigar trong lọ trong khi đang sử dụng sbt assembly cho dự án Scala

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

Tuy nhiên, khi tôi thử chạy điều này, tôi nhận được lỗi sau vì thư viện *.so không được bao gồm trong bình.

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) 

Các thư viện tôi muốn bao gồm trong lib/hyperic-sigar-1.6.4/sigar-bin/lib/*.so và họ cần phải được liên kết với một thư mục trong classpath trong jar. Cách duy nhất tôi biết để làm một bản đồ như thế này là:

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

Điều này làm cho *.so thư viện để được thêm vào gốc của jar, nhưng không phải là một thư mục cụ thể. Làm thế nào tôi có thể chỉ định một bản đồ tài nguyên để ánh xạ từ lib/hyperic-sigar-1.6.4/sigar-bin/lib/*.so đến một thư mục trong classpath trong jar của tôi? Thuật ngữ cho những gì tôi đang cố gắng làm là gì?

+0

lý do cụ thể nào khiến bạn không sử dụng "org.fusesource"% "sigar"% "1.6.4" trình phân loại ("gốc")? – OlegYch

+0

@OlegYch, tôi đã thay đổi thành sử dụng 'libraryDependencies + =" org.fusesource "%" sigar "%" 1.6.4 "' trong 'build.sbt' và tôi vẫn gặp lỗi tương tự. –

Trả lời

4

Giả sử rằng SIGAR là thực sự có khả năng tải libs có nguồn gốc từ classpath, điều này sẽ làm các trick:

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

Nếu không, bạn cần phải giải nén chúng ra khỏi lọ bằng tay và cung cấp java.library.path thích

+0

Sẽ xem xét 'java.library.path' sau. Cảm ơn! –