2013-02-19 1 views
6

Sto costruendo un progetto Scala con sbt e creando un jar con il plugin sbt-assembly. Sono in grado di aggiungere vasi non gestiti (come il barattolo di sigari) aggiungendo quanto segue a build.sbt.Includere la libreria di Hyperic Sigar all'interno di jar mentre si utilizza l'assembly sbt per il progetto Scala

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

Tuttavia, quando provo l'esecuzione di questo, ottengo il seguente errore perché le *.so librerie non sono inclusi nel vaso.

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) 

Le librerie voglio includere sono in lib/hyperic-sigar-1.6.4/sigar-bin/lib/*.so e hanno bisogno di essere collegato a una directory nel classpath all'interno del vaso. L'unico modo che conosco per fare una mappatura di questo tipo è:

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

In questo modo il *.so librerie da aggiungere al radice del vaso, ma non una directory specifica. Come posso specificare una mappa delle risorse da mappare da lib/hyperic-sigar-1.6.4/sigar-bin/lib/*.so a una directory nel classpath nel mio jar? Qual è la terminologia per ciò che sto cercando di fare?

+0

qualsiasi motivo particolare per cui non si utilizza "org.fusesource"% "sigar"% "1.6.4" classificatore ("nativo")? – OlegYch

+0

@OlegYch, ho cambiato usando 'libraryDependencies + =" org.fusesource "%" sigar "%" 1.6.4 "' in 'build.sbt', e sto ancora ricevendo lo stesso errore. –

risposta

4

Supponendo che Sigar è infatti in grado di caricare librerie native da classpath, questo dovrebbe fare il trucco:

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

In caso contrario, è necessario scompattare loro dal vaso manualmente e fornire adeguata java.library.path

+0

Esaminerà in seguito "java.library.path". Grazie! –