为 Snap 设置执行命令的正确方法是什么?

为 Snap 设置执行命令的正确方法是什么?

读完“构建 snap 教程“并检查文档, 其他教程还有一些例子,我仍然对 .yaml 中 snap 的命令部分如何工作感到困惑,或者更好地说,我如何调用 snap。

一些教程只是使用“command: example”并运行输入“example”的快照,其他使用“command: bin/example”甚至“command: bin/example.sh”。

我知道他们指向的是可执行文件所在的文件夹,所以我对 .yaml 做了同样的事情,尝试访问并执行运行我的守护进程的 jar:

apps:
  daemon-test:
    command: java -cp $SNAP/basic-project-0.0.1-SNAPSHOT.jar es.ramadorp.odm.snapcraft.test.daemon.Daemontest
    restart-condition: always 
    daemon: simple

但是当输入“daemon-test”或“name-snap.daemon-test”时,我收到“命令未找到”提示。除了解决我的问题(这很棒)之外,我还有一些问题:

  • 为什么“命令”中的 bin 文件夹?是由 snapcraft 自动生成的吗?在某些特定情况下它是强制性的吗?
  • 为什么有时需要 .sh 而其他人只需要写一个名称即可运行 snap?
  • 什么时候只需要写命令中的单词,什么时候需要写 name-snap.command-word?
  • 什么时候需要指向一个“可执行文件”,什么时候不需要,只需要一个词?

PD:我是否正确指向了我的可执行 jar?我还尝试将路由添加到 /prime/jar/ 文件夹,但没有任何效果。

答案1

严格限制的快照通常无法“看到”快照本身以外的文件夹以及一些其他位置。有环境变量指向最重要的那些。

启动 snap 时,路径设置正确,以便它能找到位于 $SNAP/bin 中的二进制文件,但它看不到 snap 之外的内容,例如(在您的情况下)java 运行时。在这种情况下,您应该为您的应用程序捆绑相关的 jvm。

可以通过以下方式实现:-

stage-packages: - openjdk-8-jre-headless

或者通过添加包含 Oracle JRE 的部分,将其解压并放在相关位置。例如,如果您有一个名为jre1.8.0_112包含 Oracle JRE 的文件夹,则您可能有如下部分:-

jbidwatcher: plugin: dump source: ./ organize: 'jre1.8.0_112': usr/lib/jvm/

然后,您可以export JAVA_HOME=$SNAP/usr/lib/jvm在执行程序之前进行设置。您可能还需要一个“包装器”脚本,该脚本会放入其中,$SNAP/bin以设置上述内容以及应用程序所需的其他环境变量。它还可以包含长命令行,如下所示:-

apps: myjavaapp: command: $SNAP/usr/bin/launch_myjavaapp plugs: - network

使用上面部分的一行将该脚本放在正确的位置:-

jbidwatcher: plugin: dump source: ./ organize: 'jre1.8.0_112': usr/lib/jvm/ 'launch_myjavaapp': usr/bin/

相关内容