我正在使用scala 2.10.1和sbt将我的webapp打包为war文件。 为了有效的rsync增量,我想将war打包为.war文件,但没有zip压缩。我只需要知道如何配置我的构建。
更新
所有这些插件文档都假设所有这些关于语法如何工作以及如何将任务组合成新任务的知识等等。我甚至无法告诉如何创建一个执行包然后命令的新任务。到目前为止,答案中没有一个具体说过,“这就是你做的......”
为了清楚起见,这就是我所要求的:
我需要一个执行此操作的任务“packnozip”:
1)运行“package”
2)运行shell命令:
$ 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完全重新发布它并不是很难看,当一个34MB的无压缩文件仅增加13%的数据时,并且只需要几分之一秒来发送有效差异的b / c,更不用说了“-z”无论如何都会压缩传输。
答案 0 :(得分: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放在目录上方。 path(2nd)参数应该包含目录,以便在其中执行zip:
Process("zip" :: "-r" :: "-0" :: "../project.war" :: "." :: Nil, "/path/to/project/") !
这是关于ProcessBuilder的另一个SO问题,也可能有所帮助:
How does the “scala.sys.process” from Scala 2.9 work?
(注意:您不需要导入scala.sys.process ._)
更新2
对于将来的读者,请注意,压缩项目目录本身是行不通的,需要使用pushd在目录内执行war的zip,将生成的war放在OP提到的目录之外在下面的评论中这个答案。正如Orange80所说:
pushd ./project && zip -r -0 ../project.war ./ && popd
更新3
看看这个,它可能完全符合你的需要,用0表示没有压缩的选项:
https://github.com/sbt/sbt-onejar
一个允许你创建一个可执行jar的插件,可以使用选项(例如像“jar 0f blah.jar blah /”这样的命令中的“0”),我想如你在评论中提到的那样下面创建没有压缩的jar文件。
对于使用我在SO上发现了这个: SBT one-jar plugin
而且,如果它需要修改,它也是一个非常合理的插件示例,如果你把它放在家里〜/ .sbt / plugins它会是全局的,可以在你的构建中使用上面的SO回答中提到的时尚。我希望至少有一点帮助/
答案 1 :(得分:0)
没有办法通过sbt配置直接执行此操作,因为sbt假定zip和jar工件中的任何文件都应该被压缩。
一种解决方法是解压缩并重新压缩(不压缩)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
}
现在,当您在sbt中运行package
时,最终的war文件将被解压缩,您可以使用unzip -vl path/to/package.war
进行验证。