无法使用 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