当前位置: 首页 > 知识库问答 >
问题:

如何配置build.sbt,使xsbt-web-plugin a在没有压缩的情况下创建war文件?

景鸿才
2023-03-14

我正在使用Scala 2.10.1和sbt将我的webapp打包为war文件。为了实现高效的rsync增量,我希望将战争打包为。war文件,但没有压缩。我只需要知道如何为此配置我的构建。

更新:所有这些插件文档都假设所有这些关于语法如何工作以及如何将任务合并到新任务中的知识,等等。我甚至不知道如何创建一个新的任务来执行package then命令。到目前为止,没有一个答案明确地说:“这就是你要做的。”

我只想说清楚,这就是我想要的:

我需要一个任务"packKnozip",这样做:

1) 运行“包”

2) 运行shell命令:

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

所以我想说的是,我想在sbt控制台中输入“packKnozip”,然后让它做#1和#2。

目前,我只是手动执行#2,如果可以自动执行的话,这看起来很愚蠢。此外,看着一个30MB的文件被rsync b/c完全重新传输,当一个34MB的未压缩文件只多出13%的数据时,它是不可扩散的,并且需要几分之一秒的时间来发送有效的差异的b/c,更不用说“-z”无论如何都会压缩传输。

共有2个答案

孟洋
2023-03-14

没有办法通过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中运行包时,最终的war文件将被解压,您可以使用解压-vl-path/to/package进行验证。战争。

濮阳立果
2023-03-14

如果您将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(第二个)参数应包含目录,以便在其中执行zip:

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

下面是关于ProcessBuilder的另一个问题,可能也会有所帮助:

scala 2.9中的“scala.sys.process”是如何工作的?

(注意:您不需要导入scala.sys.process。)

更新2

对于未来的读者,请注意压缩项目目录本身将不起作用,需要使用pushd在目录内执行war的压缩,将生成的war放在目录外,正如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答案中提到的方式在您的构建中使用。我希望这至少有一点帮助/

 类似资料:
  • 问题内容: 我正在尝试设置spring xml配置,而不必创建进一步的。但是,即使我将数据库属性包括在 spring.xml: 我在这里想念什么? 问题答案: 在entityManagerFactory bean定义中指定“ packagesToScan”和“ persistenceUnitName”属性。 请注意,这适用于Spring版本> 3.1

  • 我正在玩grpc 有人成功使用进行生产吗?我们需要包括特使在内的所有依赖项吗?

  • 我正在遵循Oracle的教程在JavaFX中创建TableView。在这个截图中,我复制并粘贴了代码,发现了几个错误,教程中没有提到这些错误。 TableView上的警告显示: TableView是原始类型。对泛型类型TableView的引用 表列上的警告说: 表列是一个原始类型。对泛型类型TableCol列的引用 addAll方法上的警告是: 类型安全:方法addAll(Object…)属于原始

  • 如何创建一个HTTP API使用Java没有任何Web框架,如Spring,JavaEE?

  • 我正在使用Guice来连接Jetty服务器,我想用Apache Shiro添加一些安全性。 似乎Shiro需要一个ServletContext来配置,但问题是我没有;在配置时没有ServletContext(例如在ServletModule中作为留档状态)。ServletContext在GuiceServletContextListener中可用,但此时,我的注入器已经创建,因此安装Shiro模块

  • 我正在尝试设置SpringXML配置,而不必创建进一步的。但是我经常遇到以下异常,即使我在 spring.xml: 我错过了什么?