2012-11-20 36 views
5

Sadece birkaç sınıf değiştiğinde rsync'yi daha hızlı yapmak için sıkıştırılmamış jar dosyaları oluşturmakla ilgileniyorum, sıkıştırma işlemini devre dışı bırakmak için sbtassembly'a nasıl söyleyeceğimi anlayamıyorum.sbtassembly kullanarak sbt'de jar sıkıştırmasını nasıl devre dışı bırakabilirim?

server > inspect assembly 
[info] Task: java.io.File 
[info] Description: 
[info] Builds a single-file deployable jar. 
[info] Provided by: 
[info] {file:/.../}server/*:assembly 
[info] Dependencies: 
[info] server/*:assembly-merge-strategy(for assembly) 
[info] server/*:assembly-output-path(for assembly) 
[info] server/*:package-options(for assembly) 
[info] server/*:assembly-assembled-mappings(for assembly) 
[info] server/*:cache-directory 
[info] server/*:test(for assembly) 
[info] server/*:streams(for assembly) 
[info] Delegates: 
[info] server/*:assembly 
[info] {.}/*:assembly 
[info] */*:assembly 

...

server > inspect assembly-option(for assembly) 
[info] Setting: sbtassembly.AssemblyOption = AssemblyOption(true,true,true,<function1>) 
[info] Description: 
[info] 
[info] Provided by: 
[info] {file:/.../}server/*:assembly-option(for assembly) 
[info] Dependencies: 
[info] server/*:assembly-assemble-artifact(for package-bin) 
[info] server/*:assembly-assemble-artifact(for assembly-package-scala) 
[info] server/*:assembly-assemble-artifact(for assembly-package-dependency) 
[info] server/*:assembly-excluded-files(for assembly) 
... 

AssemblyOption ancak ambalajı hakkında bir şey söylemez ve eklenti sbt kendi Package bunun için kullanmak gibi görünüyor, belki o yapılandırmak için bir yol var ? Paket, sırayla, dosyayı yazmak için IO.jar(...) çağırır. Bu, setMethod(ZipOutputStream.STORED)'u aramak istediğim bir ZipOutputStream (veya bir JarOutputStream) oluşturmak için withZipOutput'u kullanır, ancak yapamam.

Bir sbt özellik talebi dışında herhangi bir fikir talebi var mı?

cevap

4

Sbt yapılandırması yoluyla bunu doğrudan yapmanın bir yolu yoktur, zira sbt ve jar artifact'ları içindeki dosyaların sıkıştırılması gerektiğini varsayar.

Bir geçici çözüm, sıkıştırılmış ve yeniden sıkıştırılmış (sıkıştırma olmadan) jar dosyasıdır. Şimdi

packageBin in Compile <<= packageBin in Compile map { file => 
    println("(Re)packaging with zero compression...") 
    import java.io.{FileInputStream,FileOutputStream,ByteArrayOutputStream} 
    import java.util.zip.{CRC32,ZipEntry,ZipInputStream,ZipOutputStream} 
    val zis = new ZipInputStream(new FileInputStream(file)) 
    val tmp = new File(file.getAbsolutePath + "_decompressed") 
    val zos = new ZipOutputStream(new FileOutputStream(tmp)) 
    zos.setMethod(ZipOutputStream.STORED) 
    Iterator.continually(zis.getNextEntry). 
    takeWhile(ze => ze != null). 
    foreach { ze => 
     val baos = new ByteArrayOutputStream 
     Iterator.continually(zis.read()). 
     takeWhile(-1 !=). 
     foreach(baos.write) 
     val bytes = baos.toByteArray 
     ze.setMethod(ZipEntry.STORED) 
     ze.setSize(baos.size) 
     ze.setCompressedSize(baos.size) 
     val crc = new CRC32 
     crc.update(bytes) 
     ze.setCrc(crc.getValue) 
     zos.putNextEntry(ze) 
     zos.write(bytes) 
     zos.closeEntry 
     zis.closeEntry 
    } 
    zos.close 
    zis.close 
    tmp.renameTo(file) 
    file 
} 

Eğer sbt içinde package çalıştırdığınızda, son kavanoz dosyası ile kontrol edebilirsiniz hangi sıkıştırılmamış olacaktır: Sen ( build.sbt örn) projenize aşağıdaki ayarı ekleyerek yapabilirsiniz unzip -vl path/to/package.jar.

İlgili konular