使用 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 极简教程》

使用 IDE 运行 Spring-boot 的 main

企业级spring-boot案例-Spring Boot 启动时的运行方法

企业级spring-boot案例-Spring Boot 启动时的运行方法

企业级spring-boot案例-Spring Boot 启动时的运行方法