通过linux etc/init.d 来执行springboot jar
今天解开了一个困扰我好久的问题,我们的项目到底是怎么执行的?为什么把项目的jar包scp到服务器,然后再创建一个同名的conf文件,之后建立一个软连接就可以start和stop了?
springboot jar和普通jar的区别
- springboot jar是可执行的 不可以被其他项目依赖的
- 普通jar是不可执行的 是可以被其他项目依赖的
- springboot jar 结构
jar -xvf task-service.jar
分了三部分:
- BOOT-INF 这里面是我们的class文件和项目依赖的jar包
- META-INF 里有个重要的文件MANIFEST.MF
指明了start-class 启动类,和其他一些信息,暂时不是很明白 尴尬
- org 里面存放的是SpringBoot启动所要依据的类
- 普通jar结构
jar -xvf task.jar
可以看到只有本项目的原码 也不包含项目的依赖
springboo jar 可以在linux 的/etc/init.d 下执行
使用vim task-service.jar 可以看出在文件前面就是可以执行的脚本,这个脚本来源于 spring-boot-tools 下的spring-boot-loader-tools下的launch.script文件
有了这个脚本,所以可以使用/etc/init.d/taskService 执行springboot项目
通过bash -x查看脚本执行过程
bash -x /etc/init.d/taskService start
+ [[ -n '' ]]
++ pwd
+ WORKING_DIR=/etc/init.d
+ [[ -n '' ]]
+ [[ -n '' ]]
++ dirname /etc/init.d/taskService
+ cd /etc/init.d
+ [[ -z '' ]]
++ pwd
++ basename /etc/init.d/taskService
+ jarfile=/etc/init.d/taskService
+ [[ -L /etc/init.d/taskService ]]
+ [[ /etc/init.d/taskService =~ init\.d ]]
++ basename /etc/init.d/taskService
+ init_script=taskService
++ readlink /etc/init.d/taskService
+ jarfile=/apps/task-service/task-service.jar
++ dirname /apps/task-service/task-service.jar
+ cd /apps/task-service
++ pwd
++ basename /apps/task-service/task-service.jar
+ jarfile=/apps/task-service/task-service.jar
+ [[ -L /apps/task-service/task-service.jar ]]
+++ dirname /apps/task-service/task-service.jar
++ cd /apps/task-service
++ pwd -P
+ jarfolder=/apps/task-service
+ cd /etc/init.d
++ basename /apps/task-service/task-service.conf
+ configfile=task-service.conf
+ [[ -z '' ]]
+ CONF_FOLDER=/apps/task-service
+ [[ -r /apps/task-service/task-service.conf ]]
+ source /apps/task-service/task-service.conf
++ JAVA_HOME=/usr/local/java/jdk1.8.0_101
++ JAVA_OPTS='-Dfile.encoding=UTF-8 -Duser.language=zh -Duser.region=CN -Xmx1024M -Xms1024M
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=30119'
++ LOG_FOLDER=/logs/task-service
++ PID_FOLDER=/hvyogo/pid
+ [[ -z /hvyogo/pid ]]
+ [[ -z /logs/task-service ]]
+ [[ /hvyogo/pid == /* ]]
+ [[ /logs/task-service == /* ]]
+ [[ -x /hvyogo/pid ]]
+ [[ -x /logs/task-service ]]
+ [[ -z '' ]]
+ MODE=auto
+ [[ -z '' ]]
+ USE_START_STOP_DAEMON=true
+ [[ -z '' ]]
+ [[ -n taskService ]]
+ identity=taskService
+ [[ -z '' ]]
+ LOG_FILENAME=taskService.log
+ [[ -z '' ]]
+ STOP_WAIT_TIME=60
+ action=run
+ [[ auto == \a\u\t\o ]]
+ [[ -n taskService ]]
+ action=start
+ shift
+ PID_FOLDER=/hvyogo/pid/taskService
+ pid_file=/hvyogo/pid/taskService/taskService.pid
+ log_file=/logs/task-service/taskService.log
++ id -u
+ [[ 1005 == \0 ]]
+ [[ -n '' ]]
++ id -u
+ [[ 1005 == \0 ]]
+ [[ -n /usr/local/java/jdk1.8.0_101 ]]
+ [[ -x /usr/local/java/jdk1.8.0_101/bin/java ]]
+ javaexe=/usr/local/java/jdk1.8.0_101/bin/java
+ arguments=(-Dsun.misc.URLClassPath.disableJarChecking=true $JAVA_OPTS -jar "$jarfile" $RUN_ARGS "$@")
+ case "$action" in
+ start
+ [[ -f /hvyogo/pid/taskService/taskService.pid ]]
+ do_start
++ dirname /apps/task-service/task-service.jar
+ working_dir=/apps/task-service
+ pushd /apps/task-service
+ [[ ! -e /hvyogo/pid/taskService ]]
+ [[ ! -e /logs/task-service/taskService.log ]]
+ [[ -n '' ]]
+ checkPermissions
+ touch /hvyogo/pid/taskService/taskService.pid
+ touch /logs/task-service/taskService.log
+ pid=18401
+ disown 18401
+ echo 18401
+ [[ -z 18401 ]]
+ echoGreen 'Started [18401]'
+ /usr/local/java/jdk1.8.0_101/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.region=CN -Xmx1024M -Xms1024M -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=30119 -jar /apps/task-service/task-service.jar
+ echo 'Started [18401]'
Started [18401]
+ exit 0
可以看到最终执行的是
- /usr/local/java/jdk1.8.0_101/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.region=CN -Xmx1024M -Xms1024M -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=30119 -jar /apps/task-service/task-service.jar