如何构建 systemd 可以直接作为服务执行的 Spring 引导 jar 文件?
How do I build a Spring Boot jarfile that systemd can execute directly as a service?
如何构建 systemd 可以直接作为服务执行的 Spring 引导 jar 文件?
按照 Installation as a systemd service 中的示例,我创建了以下系统服务 直接执行 Spring 启动 jarfile:
[Unit]
Description=CRS Self-certification Service
Documentation=
Requires=postgresql.service
After=postgresql.service
[Service]
Environment=LOADER_PATH='lib/,config/,/etc/opes/crs/selfcertification'
ExecStart=/opt/opes/crs/selfcertification/crs-selfcertification-1.0.0-SNAPSHOT.jar
Restart=always
RestartSec=10
User=crs
[Install]
WantedBy=multi-user.target
然而,当启动此服务时,systemd 抱怨 jarfile 不可执行:
Nov 29 10:57:59 ubuntu systemd[24109]: selfcertification.service: Failed at step EXEC spawning /opt/opes/crs/selfcertification/crs-selfcertification-1.0.0-SNAPSHOT.jar: Exec format error
Nov 29 10:57:59 ubuntu systemd[1]: selfcertification.service: Main process exited, code=exited, status=203/EXEC
Nov 29 10:57:59 ubuntu systemd[1]: selfcertification.service: Unit entered failed state.
Nov 29 10:57:59 ubuntu systemd[1]: selfcertification.service: Failed with result 'exit-code'.
jarfile的权限为755
(所有人均可执行):
administrator@ubuntu:~$ ls -la /opt/opes/crs/selfcertification/crs-selfcertification-1.0.0-SNAPSHOT.jar
-rwxr-xr-x 1 crs selfcertification 35978778 Nov 22 17:16 /opt/opes/crs/selfcertification/crs-selfcertification-1.0.0-SNAPSHOT.jar
我必须对以下 Gradle 构建脚本进行哪些更改才能为 systemd 服务构建可执行 jar 文件?
buildscript {
ext {
springBootVersion = '1.4.2.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
jar {
baseName = 'crs-selfcertification'
version = '1.0.0-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
springBoot {
mainClass = "com.opessoftware.crs.selfcertification.Application"
layout = "ZIP"
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("org.springframework.boot:spring-boot-starter-mail")
testCompile("org.springframework.boot:spring-boot-starter-test")
compile group: 'org.postgresql', name: 'postgresql', version: '9.4.1208.jre7'
compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.1.1'
compile group: 'junit', name: 'junit', version: '4.12'
}
请注意,如果 systemd 不是直接尝试 运行 jarfile,而是 使用 Java 虚拟机 (JVM) 启动它,则此服务 运行 会成功) 来自 shell 脚本:
[Unit]
Description=CRS Self-certification Service
Documentation=
Requires=postgresql.service
After=postgresql.service
[Service]
Environment=LOADER_PATH='lib/,config/,/etc/opes/crs/selfcertification'
#ExecStart=/opt/opes/crs/selfcertification/crs-selfcertification-1.0.0-SNAPSHOT.jar
ExecStart=/opt/opes/crs/selfcertification/startCrsSelfCertification
Restart=always
RestartSec=10
User=crs
[Install]
WantedBy=multi-user.target
Shell 脚本 /opt/opes/crs/selfcertification/startCrsSelfCertification
使用 JVM 调用 jarfile:
#!/bin/sh
java -Dloader.path='lib/,config/,/etc/opes/crs/selfcertification' -jar /opt/opes/crs/selfcertification/crs-selfcertification-1.0.0-SNAPSHOT.jar
Spring 引导 jar 文件中可能缺少什么阻止 systemd 直接执行 jar 文件?
您应该指示 Spring Boot 将您的项目重新打包为 完全可执行 形式:
springBoot {
executable = true
}
此功能仅适用于 Spring Boot 1.4.0+。
从Spring启动2.X+,使用:
bootJar {
launchScript()
}
来源:
如何构建 systemd 可以直接作为服务执行的 Spring 引导 jar 文件?
按照 Installation as a systemd service 中的示例,我创建了以下系统服务 直接执行 Spring 启动 jarfile:
[Unit]
Description=CRS Self-certification Service
Documentation=
Requires=postgresql.service
After=postgresql.service
[Service]
Environment=LOADER_PATH='lib/,config/,/etc/opes/crs/selfcertification'
ExecStart=/opt/opes/crs/selfcertification/crs-selfcertification-1.0.0-SNAPSHOT.jar
Restart=always
RestartSec=10
User=crs
[Install]
WantedBy=multi-user.target
然而,当启动此服务时,systemd 抱怨 jarfile 不可执行:
Nov 29 10:57:59 ubuntu systemd[24109]: selfcertification.service: Failed at step EXEC spawning /opt/opes/crs/selfcertification/crs-selfcertification-1.0.0-SNAPSHOT.jar: Exec format error
Nov 29 10:57:59 ubuntu systemd[1]: selfcertification.service: Main process exited, code=exited, status=203/EXEC
Nov 29 10:57:59 ubuntu systemd[1]: selfcertification.service: Unit entered failed state.
Nov 29 10:57:59 ubuntu systemd[1]: selfcertification.service: Failed with result 'exit-code'.
jarfile的权限为755
(所有人均可执行):
administrator@ubuntu:~$ ls -la /opt/opes/crs/selfcertification/crs-selfcertification-1.0.0-SNAPSHOT.jar
-rwxr-xr-x 1 crs selfcertification 35978778 Nov 22 17:16 /opt/opes/crs/selfcertification/crs-selfcertification-1.0.0-SNAPSHOT.jar
我必须对以下 Gradle 构建脚本进行哪些更改才能为 systemd 服务构建可执行 jar 文件?
buildscript {
ext {
springBootVersion = '1.4.2.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
jar {
baseName = 'crs-selfcertification'
version = '1.0.0-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
springBoot {
mainClass = "com.opessoftware.crs.selfcertification.Application"
layout = "ZIP"
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("org.springframework.boot:spring-boot-starter-mail")
testCompile("org.springframework.boot:spring-boot-starter-test")
compile group: 'org.postgresql', name: 'postgresql', version: '9.4.1208.jre7'
compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.1.1'
compile group: 'junit', name: 'junit', version: '4.12'
}
请注意,如果 systemd 不是直接尝试 运行 jarfile,而是 使用 Java 虚拟机 (JVM) 启动它,则此服务 运行 会成功) 来自 shell 脚本:
[Unit]
Description=CRS Self-certification Service
Documentation=
Requires=postgresql.service
After=postgresql.service
[Service]
Environment=LOADER_PATH='lib/,config/,/etc/opes/crs/selfcertification'
#ExecStart=/opt/opes/crs/selfcertification/crs-selfcertification-1.0.0-SNAPSHOT.jar
ExecStart=/opt/opes/crs/selfcertification/startCrsSelfCertification
Restart=always
RestartSec=10
User=crs
[Install]
WantedBy=multi-user.target
Shell 脚本 /opt/opes/crs/selfcertification/startCrsSelfCertification
使用 JVM 调用 jarfile:
#!/bin/sh
java -Dloader.path='lib/,config/,/etc/opes/crs/selfcertification' -jar /opt/opes/crs/selfcertification/crs-selfcertification-1.0.0-SNAPSHOT.jar
Spring 引导 jar 文件中可能缺少什么阻止 systemd 直接执行 jar 文件?
您应该指示 Spring Boot 将您的项目重新打包为 完全可执行 形式:
springBoot {
executable = true
}
此功能仅适用于 Spring Boot 1.4.0+。
从Spring启动2.X+,使用:
bootJar {
launchScript()
}
来源: