2012-11-20 7 views
5

いくつかのクラスが変更されたときにrsyncを高速化するために非圧縮jarファイルを作成することに興味がありましたが、これまでのところsbtassemblyで圧縮を無効にする方法を理解できません。sbtassemblyを使用してsbtでjar圧縮を無効にする方法はありますか?

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しかし、包装については何も言っていない、とプラグインは、そのためのsbt自身Packageを使用しているようです?パッケージは、ファイルを書き込むために、IO.jar(...)を呼び出します。それは私がsetMethod(ZipOutputStream.STORED)を呼びたいと思うZipOutputStream(またはJarOutputStream)を作るためにwithZipOutputを使用しますが、私はできません。

sbt機能リクエスト以外のアイデアはありますか?

答えて

4

sbtはzipとjarアーチファクト内のファイルを圧縮することを前提としているので、sbt構成を介して直接行う方法はありません。

回避策の1つは、jarファイルを解凍して(圧縮せずに)再圧縮することです。あなたは(build.sbtに例えば)プロジェクトに次の設定を追加することでこれを行うことができます。

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 
} 

あなたがSBTでpackageを実行すると、最終的にjarファイルが圧縮されていないだろう、あなたが確認することができましたunzip -vl path/to/package.jar

関連する問題