无法使用 init.d startscript 执行 jar

Posted

技术标签:

【中文标题】无法使用 init.d startscript 执行 jar【英文标题】:Can't execute jar with init.d startscript 【发布时间】:2016-09-23 01:57:37 【问题描述】:

我遵循了这个教程:

作为 init.d 服务

可执行 jar 具有通常的启动、停止、重新启动和状态 命令。它还将在通常的 /var/run 中设置一个 PID 文件 目录并默认登录通常的 /var/log 目录。

你只需要像这样将你的 jar 符号链接到 /etc/init.d 中

假设你有一个 Spring Boot 应用程序安装在 /var/myapp,将 Spring Boot 应用程序安装为 init.d 服务 只需创建一个符号链接:

$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp

然后启动服务:

/etc/init.d/myapp start

当我完全按照那里的描述执行此操作时,我在 Ubuntu 14.04 控制台中收到以下错误:

ubuntu@spring:/var/myapp$ /etc/init.d/myapp start
-bash: /etc/init.d/myapp: cannot execute binary file: Exec format error

【问题讨论】:

我觉得Spring Boot CLI很有用 您在应用中使用的是哪个 spring-boot 版本? v1.2.6.RELEASE 它以嵌入式 Tomcat 服务器开始.. @julien v1.2.6 插件不支持此功能。尝试将版本更新到 1.3 或更高版本 【参考方案1】:

答案不正确,您确实可以使用 init.d 将 Spring Boot 应用程序 jar 作为服务启动。正如Stanislav 指出的那样,甚至还有一个春季教程解释了如何做到这一点:https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

问题可能出在您的 maven 文件中。我遇到了同样的问题并解决了它,将以下内容添加到我的 maven 文件中:

<plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.5.7.RELEASE</version>
            <configuration>
                <executable>true</executable>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

这里有详细说明:https://springjavatricks.blogspot.com/2017/11/installing-spring-boot-services-in.html

【讨论】:

这绝对是正确的,上面说这是不可能的答案绝对是不正确的。如果您正在使用 Boot,那么您几乎可以肯定已经拥有 Spring Boot Maven 插件。 Maven 插件是一个惊喜。源和目标可以是 1.8 或更高版本。 @KenKrueger 首先,问题是关于 Gradle,而不是 maven。无论如何,运行一些本机 jar 是不可能的。为此,您需要构建一个可执行 jar,为此您需要使用 spring boot 插件并构建一个可执行 jar。就像在这个答案中指出的那样,您必须提供一个插件并将其可执行属性设置为 true 答案和你的一样,说要将 jar 作为服务运行,你必须使用 spring boot 插件将其构建为可执行文件。但是对于 Gradle,因为问题是关于它,而不是 Maven。【参考方案2】:

您不能以这种方式运行 jar,因为它只是一个二进制文件。您必须使用已安装的 java 运行它(正如 MrPsion 的回答中提到的那样)

java -jar /var/myapp/myapp.jar

但是您不能创建指向此类命令的符号链接。您可以使用上面的命令创建一个 bash 脚本,使其可执行并创建指向该脚本的符号链接。

另外,在 Ubuntu 中,您可以使用 binfmt-support。先安装就行了

sudo apt-get install binfmt-support

然后让你的 jar 可执行

chmod a+x myapp.jar

然后你可以运行它(并用于符号链接),就像:

/var/myapp/myapp.jar

更新:

由于您有一个 Spring Boot 应用程序,请检查您的 jar 是否是在 executable 属性设置为 true 的情况下构建的

springBoot 
    executable = true

这应该可以让您以您想要的方式运行您的 jar,而无需使其成为可执行文件或需要任何其他库。

另外,根据 cmets 的说法,您使用的插件版本尚不支持此功能。您必须更新插件版本才能获得可执行的 jar。根据插件来源和commit history,您至少需要 1.3 版本

【讨论】:

当我将此行添加到我的 gradle.build 时,我遇到了这个问题:No such property: executable for class: org.springframework.boot.gradle.SpringBootPluginExtension_Decorated 如果没有此配置,您将无法使用您提供的用户指南中的解决方案。事实上,SpringBootPlugin 没有这样的属性意味着你可能有一个版本的插件,它不支持这个特性。 注意,根据文档,这个扩展从插件的 1.3 版本开始可用【参考方案3】:

你需要使用java“执行”jar

java -jar /var/myapp/myapp.jar

和初始化脚本通常不链接到可执行文件。

这篇文章将向您展示如何为 java 应用程序创建一个 init 脚本。

Run a Java Application as a Service on Linux

【讨论】:

这是一个弹簧启动应用程序。正确配置 spring-boot 项目的构建将生成一个 jar,该 jar 将作为可执行文件处理,因为它将在 jar 前面嵌入一个附加脚本。你可以在这里阅读docs.spring.io/spring-boot/docs/current/reference/html/…

以上是关于无法使用 init.d startscript 执行 jar的主要内容,如果未能解决你的问题,请参考以下文章

travis:sh:0:无法打开/etc/init.d/xvfb

Mongo mongod init.d 脚本无法在 CentOS 上运行

春天启动的init.d没有未运行(过程未找到)

利用BashShell编写Nginx服务控制脚本

debian手动安装MYSQL5不能随系统自动启动??

centOS外部浏览器无法访问tomcat8000端口解决办法