使用 sbt native packager 为 scala play app 创建 rpm
Posted
技术标签:
【中文标题】使用 sbt native packager 为 scala play app 创建 rpm【英文标题】:creating rpm using sbt native packager for scala play app 【发布时间】:2018-09-29 06:56:49 【问题描述】:我正在使用 sbt native packager (https://github.com/sbt/sbt-native-packager) 为 scala play 应用程序创建 rpm。我按照说明运行命令sbt rpm:packageBin
。但是,它构建了.jar
文件,这是 rpm 构建吗?我认为 rpm 构建应该是 .rpm 扩展名?
我确实收到了错误,但我仍然可以看到 .jar
文件
[info] Done packaging.
[error] `rpmVendor in Rpm` is empty. Please provide a valid vendor for the rpm SPEC.
[error] java.lang.RuntimeException: There are issues with the rpm spec data.
[error] at scala.sys.package$.error(package.scala:27)
[error] at com.typesafe.sbt.packager.rpm.RpmSpec.validate(RpmMetadata.scala:154)
[error] at com.typesafe.sbt.packager.rpm.RpmHelper$.stage(RpmHelper.scala:25)
[error] at com.typesafe.sbt.packager.rpm.RpmPlugin$.$anonfun$projectSettings$47(RpmPlugin.scala:158)
[error] at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:42)
[error] at sbt.std.Transform$$anon$4.work(System.scala:64)
[error] at sbt.Execute.$anonfun$submit$2(Execute.scala:257)
[error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error] at sbt.Execute.work(Execute.scala:266)
[error] at sbt.Execute.$anonfun$submit$1(Execute.scala:257)
[error] at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:167)
[error] at sbt.CompletionService$$anon$2.call(CompletionService.scala:32)
[error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error] at java.lang.Thread.run(Thread.java:748)
[error] (rpm:stage) There are issues with the rpm spec data.
【问题讨论】:
您能否将您的 build.sbt 包含在您的问题中? 我没有对 rpm 的 build.sbt 进行任何更改。但是我在 plugins.sbt 中添加了addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.4")
。我可以看到/target/rpm
文件夹但看不到.rpm
文件
【参考方案1】:
Play Framework 需要一些额外的 rpm 设置。这记录在here in the Play Documentation。 为简单起见,我在此处复制相关部分:
最低 RPM 设置
将以下设置添加到您的构建中:
lazy val root = (project in file("."))
.enablePlugins(PlayScala)
maintainer in Linux := "First Lastname <first.last@example.com>"
packageSummary in Linux := "My custom package summary"
packageDescription := "My longer package description"
rpmRelease := "1"
rpmVendor := "example.com"
rpmUrl := Some("http://github.com/example/server")
rpmLicense := Some("Apache v2")
然后构建你的包:
[my-first-app] $ rpm:packageBin
最后你应该在 target/rpm/RPMS/noarch/ -folder(或类似的东西)下拥有projectname-projectversion.rpm
。
【讨论】:
rpmUrl
是什么意思? rpmUrl := Some("http://github.com/example/server")
表示我们要发布 rpm 的服务器?我想将 rpm 发布到 artifactory。
官方描述说“这个Url应该有完整的URL,以获得更多关于程序的信息。通常这是被打包软件的上游项目网站”,rpm-packaging-guide.github.io。即使它只是供内部使用,也可以链接到一些内部 wiki 或 git -page 来说明打包的 rpm 是关于什么的。【参考方案2】:
在您的 cmets 之后,我会说您需要在 build.sbt 文件中添加更多信息。
您的项目应包含有关 rpm 的数据。您可以使用很多设置here,但最起码的是将 rpmVendor 添加到您的 build.sbt 中,如下所示:
rpmVendor := "VendorName"
如果您需要示例,请查看 Github 上的一些示例。
【讨论】:
我必须根据文档使用rpmVendor := "typesafe"
?我不知道供应商在这里的真正含义。我想将 rpm 发布到 artifactory
供应商的定义是RPM背后的公司或组织的名称以上是关于使用 sbt native packager 为 scala play app 创建 rpm的主要内容,如果未能解决你的问题,请参考以下文章
为使用 sbt-native-packager 创建的可执行文件设置 JVM 选项的推荐方法是啥?
使用 sbt native packager 为 scala play app 创建 rpm
如何在运行时为使用 sbt-native-packager 捆绑的应用程序加载配置文件
在 SBT 中为 sbt-native-packager 的 packageMappings 构建路径