Sbt 本机打包程序找不到 SystemdPlugin

Posted

技术标签:

【中文标题】Sbt 本机打包程序找不到 SystemdPlugin【英文标题】:Sbt native packager not finding SystemdPlugin 【发布时间】:2016-11-21 01:56:23 【问题描述】:

我正在尝试构建一个使用 Systemd 原型的 rpm。但是,我在 build.sbt 中导入时遇到错误。我正在使用 sbt 版本 0.13.11 具体来说,我看到:

build.sbt:3: error: object systemloader is not a member of package com.typesafe.sbt.packager.archetypes

我正在尝试使用 sbt-native-packager 的 1.1.4 版。这是我的 plugins.sbt:

// The Typesafe repository
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

// The Sonatype snapshots repository
resolvers += "Sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/"

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.1.4")

我的 build.sbt:

import com.typesafe.sbt.packager.linux.LinuxSymlink
import com.typesafe.sbt.packager.rpm.RpmPlugin.autoImport._
import com.typesafe.sbt.packager.archetypes.systemloader._

scalaVersion := "2.11.7"

name := "systemdtest"

organization := "myTestOrg"

enablePlugins(JavaServerAppPackaging, RpmPlugin, SystemdPlugin)

version := "1.0"

// RPM SETTINGS
rpmVendor := "me"

packageSummary in Linux := "A summary"

packageDescription := "Do some stuff"

rpmRelease := "1"

rpmBrpJavaRepackJars := false

rpmLicense := Some("Copyright this project")

rpmGroup := Some("mygroup")

rpmPrefix := Some("/opt/mypath")

我在尝试运行时遇到错误

sbt stage

sbt rpm:packageBin

【问题讨论】:

【参考方案1】:

本地打包网站 (http://www.scala-sbt.org/sbt-native-packager/archetypes/systemloaders.html) 上的 1.1 文档说要使用名为 SystemdPlugin 的自动插件。

但是,这在 1.1 分支中不存在,并且是在 1.2 分支中引入的(在本文发布时为 1.2.0M3),尚未 GA。

正确的约定是在你的 build.sbt 中添加一个名为“serverLoading”的赋值。

就我而言,要与 RPM 一起使用,我需要将 build.sbt 更改为以下内容:

import com.typesafe.sbt.packager.rpm.RpmPlugin.autoImport._
import com.typesafe.sbt.packager.archetypes.ServerLoader

scalaVersion := "2.11.7"

name := "systemdtest"

organization := "myTestOrg"

enablePlugins(JavaServerAppPackaging)

version := "1.0"

// RPM SETTINGS
rpmVendor := "me"

packageSummary in Linux := "A summary"

packageDescription := "Do some stuff"

rpmRelease := "1"

rpmBrpJavaRepackJars := false

rpmLicense := Some("Copyright this project")

rpmGroup := Some("mygroup")

rpmPrefix := Some("/opt/mypath")

//THIS IS THE KEY PIECE!!
serverLoading in Rpm := ServerLoader.Systemd

我在阅读有关此问题的 cmets 时找到了我的解决方案。 https://github.com/sbt/sbt-native-packager/pull/785

【讨论】:

这对我有用!也适用于 Debian,通过添加到 build.sbt: serverLoading in Debian := ServerLoader.Systemd 使用 sbt-native-packager 版本 1.2-M8(可能更早),您需要 serverLoading in Rpm := Some(ServerLoader.Systemd)【参考方案2】:

sbt native-packager 1.2.0 即将发布(2016 年 11 月),Muki Seiler 详细信息 this new feature 即将发布 PR 785:

Systemloaders 现在是 AutoPlugins

之前,Java Server Application Archetype 提供了一个设置 serverLoading,您可以在其中定义系统加载程序,如下所示:

import com.typesafe.sbt.packager.archetypes.ServerLoader

serverLoading in Rpm := ServerLoader.Upstart

这会添加必要的配置文件和维护脚本(postinstpostun 等),以便注册和启动您的应用程序。

服务器原型和systemloaders 之间的紧密耦合的最大问题是很难在不改变服务器原型的情况下添加systemloader 特定设置。 对代码和输出进行推理也困难得多。

通过额外的系统加载器插件,我们打开了可能性

轻松扩展单个系统加载器 有一个地方可以放置通用的systemloader 功能(有一个SystemLoaderPlugin 负责通用设置) 单独测试系统加载器 更好的开发者体验

您可以通过启用具体的systemloader 插件来启用systemloader

enablePlugins(SystemdPlugin)

【讨论】:

以上是关于Sbt 本机打包程序找不到 SystemdPlugin的主要内容,如果未能解决你的问题,请参考以下文章

Sbt 本机打包程序不创建服务脚本文件

SBT 本机打包程序不会将文件复制到 Docker 映像

如何将 PostgreSQL 卷附加到使用 SBT 本机打包程序生成的 Docker 映像?

SBT 本机打包程序不生成任何 sysv /etc/init.d/ 脚本

sbt 原生打包器 dockerCommands 复制

Google Maps Javascript API V3 在移动/本机应用程序上找不到 404