Application Spring Boot en tant que service

1. Vue d'ensemble

Cet article explore certaines options pour exécuter des applications Spring Boot en tant que service.

Tout d'abord, nous allons expliquer les options de packaging et les services système des applications web. Dans les sections suivantes, nous explorons différentes alternatives que nous avons lors de la configuration d'un service à la fois pour Linux et pour les systèmes Windows.

Enfin, nous conclurons par quelques références à d'autres sources d'informations.

2. Instructions de configuration et de construction du projet

2.1. Emballage

Les applications Web sont traditionnellement conditionnées en tant qu'archives d'applications Web (WAR) et déployées sur un serveur Web.

Les applications Spring Boot peuvent être regroupées sous forme de fichiers WAR et JAR. Ce dernier intègre un serveur Web dans un fichier JAR, ce qui vous permet d'exécuter des applications sans avoir besoin d'une installation et d'une configuration d'un serveur d'applications.

2.2. Configuration Maven

Commençons par définir la configuration de notre fichier pom.xml :

jar  org.springframework.boot spring-boot-starter-parent 1.4.0.RELEASE   ....     org.springframework.boot spring-boot-maven-plugin  true    

L'emballage doit être mis en pot . Nous utilisons la dernière version stable de Spring Boot au moment de la rédaction, mais toute version après 1.3 suffira. Vous pouvez trouver plus d'informations sur les versions disponibles ici.

Notez que nous avons défini le paramètre à true pour l' artefact spring-boot-maven-plugin . Cela garantit qu'un fichier MANIFEST.MF est ajouté au package JAR. Ce manifeste contient une entrée Main-Class qui spécifie quelle classe définit la méthode principale de votre application.

2.3. Construire votre application

Exécutez la commande suivante dans le répertoire racine de votre application:

$ mvn clean package

Le fichier exécutable JAR est maintenant disponible dans le répertoire cible et nous pouvons démarrer l'application en exécutant la commande suivante sur la ligne de commande:

$ java -jar your-app.jar

À ce stade, vous devez toujours appeler l'interpréteur Java avec l' option -jar . Il existe de nombreuses raisons pour lesquelles il serait préférable de démarrer votre application en pouvant l'invoquer en tant que service.

3. Sous Linux

Pour exécuter un programme en tant que processus d'arrière-plan, nous pourrions simplement utiliser la commande nohup Unix, mais ce n'est pas non plus la méthode préférée pour diverses raisons. Une bonne explication est fournie dans ce fil.

Au lieu de cela, nous allons démoniser notre processus. Sous Linux, nous pouvons choisir de configurer un démon soit avec un script d' initialisation System V traditionnel, soit avec un fichier de configuration Systemd . La première est traditionnellement l'option la plus connue, mais elle est progressivement remplacée par la seconde.

Vous pouvez trouver plus de détails sur cette différence ici.

Pour une sécurité améliorée, nous créons d'abord un utilisateur spécifique avec lequel exécuter le service et modifions les autorisations du fichier JAR exécutable en conséquence:

$ sudo useradd baeldung $ sudo passwd baeldung $ sudo chown baeldung:baeldung your-app.jar $ sudo chmod 500 your-app.jar

3.1. Init système V

Un fichier JAR exécutable Spring Boot facilite le processus de configuration du service:

$ sudo ln -s /path/to/your-app.jar /etc/init.d/your-app

La commande ci-dessus crée un lien symbolique vers votre fichier JAR exécutable. Vous devez utiliser le chemin complet de votre fichier JAR exécutable, sinon le lien symbolique ne fonctionnera pas correctement. Ce lien vous permet de démarrer l'application en tant que service:

$ sudo service your-app start

Le script prend en charge les commandes standard de démarrage , d' arrêt , de redémarrage et d' état du service . De plus:

  • il démarre les services exécutés sous l'utilisateur baeldung que nous venons de créer
  • il suit l'ID de processus de l'application dans /var/run/your-app/your-app.pid
  • il écrit les journaux de la console dans /var/log/your-app.log , que vous voudrez peut-être vérifier si votre application ne démarre pas correctement

3.2. Systemd

La configuration du service systemd est également très simple. Tout d'abord, nous créons un script nommé your-app.service en utilisant l'exemple suivant et le plaçons dans le répertoire / etc / systemd / system :

[Unit] Description=A Spring Boot application After=syslog.target [Service] User=baeldung ExecStart=/path/to/your-app.jar SuccessExitStatus=143 [Install] WantedBy=multi-user.target

N'oubliez pas de modifier les champs Description , Utilisateur et ExecStart pour qu'ils correspondent à votre application. Vous devriez également pouvoir exécuter les commandes de service standard susmentionnées à ce stade.

Contrairement à l' approche d' initialisation System V décrite dans la section précédente, le fichier d'ID de processus et le fichier journal de la console doivent être configurés explicitement à l'aide des champs appropriés dans le script de service. Une liste exhaustive d'options peut être trouvée ici.

3.3. Parvenu

Upstart est un gestionnaire de services basé sur les événements, un remplacement potentiel pour l' initialisation System V qui offre plus de contrôle sur le comportement des différents démons.

Le site a de bonnes instructions de configuration qui devraient fonctionner pour presque toutes les distributions Linux. Lorsque vous utilisez Ubuntu, vous l'avez probablement déjà installé et configuré (vérifiez s'il existe des travaux avec un nom commençant par «upstart» dans / etc / init ).

Nous créons un job your-app.conf pour démarrer notre application Spring Boot:

# Place in /home/{user}/.config/upstart description "Some Spring Boot application" respawn # attempt service restart if stops abruptly exec java -jar /path/to/your-app.jar 

Now run “start your-app” and your service will start.

Upstart offers many job configuration options, you can find most of them here.

4. On Windows

In this section, we present a couple of options that may be used to run a Java JAR as a Windows service.

4.1. Windows Service Wrapper

Due to difficulties with the GPL license of the Java Service Wrapper (see next subsection) in combination with e.g. the MIT license of Jenkins, the Windows Service Wrapper project, also known as winsw, was conceived.

Winsw provides programmatic means to install/uninstall/start/stop a service. In addition, it may be used to run any kind of executable as a service under Windows, whereas Java Service Wrapper, as implied by its name, only supports Java applications.

First, you download the binaries here. Next, the configuration file that defines our Windows service, MyApp.xml, should look like this:

 MyApp MyApp This runs Spring Boot as a Service.  java -Xmx256m -jar "%BASE%\MyApp.jar" rotate  

Finally, you have to rename the winsw.exe to MyApp.exe so that its name matches with the MyApp.xml configuration file. Thereafter you can install the service like so:

$ MyApp.exe install

Similarly, you may use uninstall, start, stop, etc.

4.2. Java Service Wrapper

In case you don't mind the GPL licensing of the Java Service Wrapper project, this alternative may address your needs to configure your JAR file as a Windows service equally well. Basically, the Java Service Wrapper also requires you to specify in a configuration file which specifies how to run your process as a service under Windows.

This article explains in a very detailed way how to set up such an execution of a JAR file as a service under Windows, so we there's no need to repeat the info.

5. Additional References

Spring Boot applications may also be started as Windows service using Procrun of the Apache Commons Daemon project. Procrun is a set of applications that allow Windows users to wrap Java applications as Windows services. Such a service may be set to start automatically when the machine boots and will continue to run without any user being logged on.

More details on starting Spring Boot applications under Unix may be found here. There are also detailed instructions on how to modify Systemd unit files for Redhat based systems. Finally

Finally, this quick howto describes how to incorporate a Bash script into your JAR file, so that it becomes an executable itself!

6. Conclusion

Services allow you to manage your application state very efficiently and, as we have seen, service setup for Spring Boot applications is now easier than ever.

N'oubliez pas de suivre les mesures de sécurité importantes et simples sur les autorisations des utilisateurs pour exécuter votre service.