5

Scala 2.10.1 と sbt を使用して、webapp を war ファイルとしてパッケージ化しています。効率的な rsync デルタの目的で、war を .war ファイルとしてパッケージ化したいのですが、zip 圧縮はしません。このためにビルドを構成する方法を知る必要があります。

更新:
これらのすべてのプラグイン ドキュメントは、構文がどのように機能するか、タスクを新しいタスクに結合する方法などに関するすべての知識を前提としています。パッケージ化してからコマンドを実行する新しいタスクを作成する方法さえわかりません。これまでのところ、「これがあなたの仕事です..」と具体的に述べた回答はありません。

明確にするために、これが私が求めているすべてです:

これを行うタスク「packnozip」が必要です。

1) 「パッケージ」を実行

2) シェル コマンドを実行します。

$ mkdir ./Whatever 
$ pushd ./Whatever 
$ jar xvf ../Whatever.war 
$ popd 
$ mv ./Whatever.war ./Whatever.war.orig 
$ jar cvM0f ./Whatever.war -C ./Whatever . 

つまり、sbt コンソールに「packnozip」と入力して、#1 と #2 を実行させたいということです。

今のところ、自動化できるとばかげているように見える#2を手動で行っています。また、30MB のファイルが rsync b/c によって完全に再送信されるのを見るのは、diffable ではありません。 「-z」はとにかく転送を圧縮します。

4

2 に答える 2

2

war ファイルをディレクトリに解凍した場合は、次のことができます。

zip -r -0 project.war project/

それはゼロ圧縮でなければなりません。これらのオプションが表示されない場合は、これが私のセットアップです。

[node@hip1 dev]$ zip -v
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.

これは、戦争がパッケージ化された後、実行タスクとして実行できると思います。

更新 1

これがあなたのニーズを達成するための最良の方法だと思います:

http://www.scala-sbt.org/release/docs/Detailed-Topics/Process

val exitcode = "zip -r -0 project.war project/"!

ただし、特定のディレクトリから作業する必要がある場合 (以下の更新 2 を参照してください):

これをディレクトリ内で実行するように変更しましたが、ディレクトリの上に .war を配置しました。パス (2 番目) 引数にはディレクトリを含める必要があります。これにより、zip がその中で実行されます。

Process("zip" :: "-r" :: "-0" :: "../project.war" :: "." :: Nil, "/path/to/project/") !

同様に役立つ可能性がある ProcessBuilder に関する別の SO の質問は次のとおりです。

Scala 2.9 の「scala.sys.process」はどのように機能しますか?

(注: scala.sys.process._ をインポートする必要はありません)

更新 2

将来の読者のために、プロジェクトディレクトリ自体の圧縮は機能しないことに注意してください.pushdを使用してディレクトリ内で戦争のzipを実行し、OPがコメントで述べたように結果の戦争をディレクトリの外に置く必要がありますこの答えの下。Orange80が言及したように:

pushd ./project && zip -r -0 ../project.war ./ && popd

更新 3

これを確認してください。圧縮なしを指定するオプションに 0 を指定すると、必要なことを正確に行うことができます。

https://github.com/sbt/sbt-onejar

オプション(たとえば、「jar 0f blah.jar blah /」のようなコマンドの「0」)を使用して、単一の実行可能jarを作成できるプラグインを作成できます。以下のコメントで言及したように作成すると思います圧縮なしのjarファイル。

使用法については、SOでこれを見つけました: SBT one-jar plugin

また、変更が必要な場合は、プラグインのかなり合理的な例でもあります。これをホーム ~/.sbt/plugins にドロップすると、グローバルになり、前述の方法でビルドで使用できます。上記のSOの回答で。少しでもお役に立てば幸いです/

于 2013-06-26T22:41:51.930 に答える
0

sbt は zip および jar アーティファクト内のすべてのファイルを圧縮する必要があると想定しているため、sbt 構成を介して直接これを行う方法はありません。

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

packageWar in Compile <<= packageWar 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これで sbt で実行すると、最終的な war ファイルが解凍され、 unzip -vl path/to/package.war.

于 2013-08-16T21:25:01.213 に答える