使用 init.d 运行 Spring Boot Jar 时出错
Posted
技术标签:
【中文标题】使用 init.d 运行 Spring Boot Jar 时出错【英文标题】:Error Running SpringBoot Jar using init.d 【发布时间】:2016-08-20 11:53:23 【问题描述】:我有一个 SpringBoot 应用程序,为此我使用gradle :myapp:jar
来生成一个可执行的 jar。此外,我还必须使用chmod 755 myapp.jar
来使jar 可执行。
这是生成jar的gradle代码as described here:
springBoot 可执行=真
springBoot
executable = true
jar
baseName = 'myapp'
version = '0.1.0'
manifest
attributes "Main-Class": "eu.myapp.Application"
from
configurations.compile.collect it.isDirectory() ? it : zipTree(it)
然后我创建一个指向 init.d 的符号链接 as described here 以便使用启动/停止/状态。我正在执行的创建符号链接的命令是这样的:
sudo ln -fs myjar.jar /etc/init.d/myjar
在这之后,我可以这样做:
sudo /etc/init.d/myapp start
问题是当我执行这个命令时,我得到以下错误:
/etc/init.d/myapp: 1: /etc/init.d/myapp: PK: not found
/etc/init.d/myapp: 2: /etc/init.d/myapp�z�H: not found
/etc/init.d/myapp: 3: /etc/init.d/myapp: Syntax error: ")" unexpected
网上查了it appears to be related to a shebang issue,可以通过在文件开头加#!/bin/bash
来解决。但是,由于我正在运行由gradle
生成的.jar
,我需要在哪里添加这一行?或者,我该如何解决上述错误?
【问题讨论】:
【参考方案1】:jar
任务不会生成适合通过 init.d 启动的完全可执行的 jar。相反,您需要运行 Spring Boot 的 Gradle 插件提供的 bootRepackage
任务,并且您还需要对其进行配置以生成完全可执行的 jar。为此,请将以下内容添加到您的 build.gradle
:
springBoot
executable = true
【讨论】:
bootRepackage 命令成功了,谢谢!确实,还需要 executable=true 部分;我已经有了,但忘了提及(现已更新)。【参考方案2】:sudo ln -fs myjar.jar /etc/init.d/myjar
我认为您需要为源代码使用完整路径(即 /your/full/path/to/myjar.jar)
【讨论】:
我可以确认情况并非如此,相对路径工作正常。无论如何,感谢您的宝贵时间。【参考方案3】:通过命令行执行应用程序的一种方式。
当您拥有apply plugin:'java'
时,spring 会查找 bootJar 并默认禁用 Jar 任务。
为了构建完全可执行的 jar,您可以包含此代码
bootJar
启动脚本()
然后清理您的构建并运行一次 bootJar 任务。稍后导航到 gradle 文件夹并运行
./gradlew bootRun
这将运行您的 spring-boot 应用程序。我认为还有很多其他方式,例如java -jar <yourapplication.jar>
。但我遵循这种方式。希望对您有所帮助。
【讨论】:
以上是关于使用 init.d 运行 Spring Boot Jar 时出错的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 内嵌启动脚本配置(Customizing the startup script)
使用 Docker 构建部署运行Spring Boot应用 《Spring Boot 2.0 极简教程》
企业级spring-boot案例-Spring Boot 启动时的运行方法