Search code examples
linuxspring-bootservicestartupinit.d

Spring Boot application as a Service


How to configure nicely Spring Boot application packaged as executable jar as a Service in the Linux system? Is this recommended approach, or should I convert this app to war and install it into Tomcat?

Currently, I can run Spring boot application from the screen session, which is nice but requires manual start after a server reboot.

What I'm looking for is general advice/direction or sample init.d the script, if my approach with executable jar is proper.


Solution

  • The following works for springboot 1.3 and above:

    As init.d service

    The executable jar has the usual start, stop, restart, and status commands. It will also set up a PID file in the usual /var/run directory and logging in the usual /var/log directory by default.

    You just need to symlink your jar into /etc/init.d like so

    sudo link -s /var/myapp/myapp.jar /etc/init.d/myapp
    

    OR

    sudo ln -s ~/myproject/build/libs/myapp-1.0.jar /etc/init.d/myapp_servicename
    

    After that you can do the usual

    /etc/init.d/myapp start
    

    Then setup a link in whichever runlevel you want the app to start/stop in on boot if so desired.


    As a systemd service

    To run a Spring Boot application installed in var/myapp you can add the following script in /etc/systemd/system/myapp.service:

    [Unit]
    Description=myapp
    After=syslog.target
    
    [Service]
    ExecStart=/var/myapp/myapp.jar
    
    [Install]
    WantedBy=multi-user.target
    

    NB: in case you are using this method, do not forget to make the jar file itself executable (with chmod +x) otherwise it will fail with error "Permission denied".

    Reference

    http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-service