Как настроить 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
,