2012-11-20 15 views
5

मुझे कुछ rarsync तेजी से बनाने के लिए असंपीड़ित जार फ़ाइलों को बनाने में दिलचस्पी है, जब केवल कुछ वर्ग बदलते हैं और अब तक, मैं यह नहीं समझ सकता कि संपीड़न को अक्षम करने के लिए sbtassembly कैसे बताना है।मैं sbtassembly का उपयोग कर एसबीटी में जार संपीड़न कैसे अक्षम कर सकता हूं?

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 पैकेजिंग के बारे में कुछ भी कहना नहीं है, तथापि, और प्लगइन एसबीटी के अपने Package कि के लिए उपयोग करने के लिए लगता है, इसलिए हो सकता है वहाँ कि कॉन्फ़िगर करने के लिए एक रास्ता है ? पैकेज, बदले में, फ़ाइल लिखने के लिए IO.jar(...) पर कॉल करता है। यह ZipOutputStream (या एक JarOutputStream) बनाने के लिए withZipOutput का उपयोग करता है, जिस पर मैं setMethod(ZipOutputStream.STORED) पर कॉल करना चाहता हूं, लेकिन मैं नहीं कर सकता।

किसी एसबीटी सुविधा अनुरोध के अलावा कोई भी विचार?

उत्तर

4

एसबीटी कॉन्फ़िगरेशन के माध्यम से इसे सीधे करने का कोई तरीका नहीं है, क्योंकि एसबीटी मानता है कि ज़िप और जार कलाकृतियों के भीतर किसी भी फाइल को संपीड़ित किया जाना चाहिए।

एक वर्कअराउंड जार फ़ाइल को अनजिप और री-ज़िप (संपीड़न के बिना) करना है।

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 
} 

अब जब आप एसबीटी में package चलाने के लिए, अंतिम जार फ़ाइल, असम्पीडित हो जाएगा आप के साथ सत्यापित कर सकते हैं: आप अपनी परियोजना (जैसे में build.sbt) के लिए निम्न सेटिंग जोड़कर ऐसा कर सकते हैं unzip -vl path/to/package.jar

संबंधित मुद्दे

 संबंधित मुद्दे