Как настроить build.sbt так, чтобы xsbt-web-plugin a создавал war-файл без сжатия?

Я использую Scala 2.10.1 с sbt, чтобы упаковать мое веб-приложение в файл 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 . 

Итак, я хочу напечатать "packnozip" в консоли sbt и сделать так, чтобы #1, а затем #2.

На данный момент я просто делаю # 2 вручную, что кажется глупым, если это можно автоматизировать. Кроме того, при просмотре 30-мегабайтного файла с помощью rsync b/c он становится недосягаемым, что выглядит довольно глупо, когда несжатый 34-мегабайтный файл занимает всего 13% данных, а отправка ч / б эффективных различий занимает доли секунды, не говоря уже о том, что "-z" сожмет передачу в любом случае.

2 ответа

Если у вас есть распакованный военный файл в каталоге, вы можете:

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 выше каталога. Аргумент path (2nd) должен включать каталог, чтобы внутри него выполнялся zip:

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

Вот еще один вопрос о ProcessBuilder, который также может помочь:

Как работает "scala.sys.process" из Scala 2.9?

(Примечание: вам не нужно импортировать scala.sys.process._)

ОБНОВЛЕНИЕ 2

Для читателей в будущем, пожалуйста, обратите внимание, что архивирование самого каталога проекта не будет работать, нужно выполнить zip of the war внутри каталога с помощью pushd, поместив получившуюся войну за пределы каталога, как упомянуто OP в комментариях. ниже этого ответа. Как упомянул Orange80:

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

ОБНОВЛЕНИЕ 3

Проверьте это, он может делать именно то, что вам нужно, с 0 для опций, указывающих отсутствие сжатия:

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

плагин, который позволяет вам создать один исполняемый файл jar, который может быть создан с параметрами (например, "0", например, в команде типа "jar 0f blah.jar blah/"), как вы упоминали в комментариях ниже, для создания файл jar без сжатия.

Для использования я нашел это на SO: SBT one-jar плагин

А также, если его нужно изменить, это также довольно разумный пример плагина, который, если вы уроните его в свой домашний каталог ~/.sbt/plugins, будет глобальным и может быть использован в вашей сборке способом, отмеченным в SO ответ выше. Я надеюсь, что это поможет хоть немного

Невозможно сделать это напрямую через конфигурацию sbt, так как sbt предполагает, что любые файлы в артефактах zip и jar должны быть сжаты.

Один из обходных путей - разархивировать и повторно заархивировать (без сжатия) файл войны. Вы можете сделать это, добавив следующие настройки в ваш проект (например, в 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 окончательный файл войны будет распакован, что можно проверить с помощью unzip -vl path/to/package.war,

Другие вопросы по тегам