Spring-boot : Application en tant que service windows

Le but de cet article est de présenter l'installation d'une application spring-boot en tant que service windows.

winsw

Afin d’exécuter un programme en tant que service j'ai choisi d'utiliser winsw.

Ce projet a été créé afin de ne pas utiliser Java Service wrapper qui est sous licence GPL. En effet la GPL n'est pas compatible avec la licence MIT. Il n'est pas possible de l'utiliser en dehors d'un projet Open Source.

Dépendance maven

<dependency>
	<groupId>com.sun.winsw</groupId>
	<artifactId>winsw</artifactId>
	<classifier>bin</classifier>
	<type>exe</type>
	<scope>provided</scope>
</dependency>

Configuration

Winsw permet d'envelopper un programme en tant que service windows. Il doit être configuré à l'aide d'un fichier XML.

<service>
	<id>@dist.project.id@</id>
	<name>@dist.project.name@</name>
	<description>@dist.project.description@</description>
	<workingdirectory>%BASE%\</workingdirectory>
	<logpath>%BASE%\logs</logpath>
	<logmode>rotate</logmode>

	<executable>java</executable>
	<startargument>-cp</startargument>
	<startargument>lib/*</startargument>
	<startargument>fr.netapsys.desktop.daemon.StartSpringBootService</startargument>
	<startargument>@dist.start.class@</startargument>

	<stopexecutable>java</stopexecutable>
	<stopargument>-cp</stopargument>
	<stopargument>lib/*</stopargument>
	<stopargument>fr.netapsys.desktop.daemon.StopSpringBootService</stopargument>
</service>

Les paramètres entourés de @ sont obtenus à partir du fichier pom.xml dans la section Properties :

<properties>
		<dist.dir>${project.build.directory}/dist</dist.dir>
		<dist.project.id>${project.artifactId}</dist.project.id>
		<dist.project.name>Netapsys</dist.project.name>
		<dist.project.description>
			Netapsys service daemon
		</dist.project.description>
		<dist.start.class>fr.netapsys.NetapsysDesktopApplication</dist.start.class>
	</properties>

Ces propriétés permettent de définir les informations à propos du service. Elles seront affichées dans le gestionnaire de services windows.

Les parties "executable" et "stopexecutable" décrivent les commandes pour démarrer et arrêter le service. Le paramètre dist.start.class indique la classe principale de l'application. Indiquez la classe principale de votre application SpringBoot à cet endroit.

Les composants utilisés pour démarrer et arrêter le service se trouvent à cet endroit :

https://github.com/snicoll-scratches/spring-boot-daemon/tree/master/spring-boot-daemon-integration

Construction du zip

Les plugins maven dependency, resources et assembly sont utilisés pour construire le livrable de l'application :

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-dependency-plugin</artifactId>
	<version>2.10</version>
	<executions>
		<execution>
			<id>copy</id>
			<phase>package</phase>
			<goals>
				<goal>copy</goal>
			</goals>
			<configuration>
				<artifactItems>
					<artifactItem>
						<groupId>com.sun.winsw</groupId>
						<artifactId>winsw</artifactId>
						<classifier>bin</classifier>
						<type>exe</type>
						<destFileName>service.exe</destFileName>
					</artifactItem>
				</artifactItems>
				<outputDirectory>${dist.dir}</outputDirectory>
			</configuration>
		</execution>
	</executions>
</plugin>
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-resources-plugin</artifactId>
	<version>2.7</version>
	<executions>
		<execution>
			<id>copy-resources</id>
			<phase>process-resources</phase>
			<goals>
				<goal>copy-resources</goal>
			</goals>
			<configuration>
				<outputDirectory>${dist.dir}</outputDirectory>
				<resources>
					<resource>
						<directory>src/main/dist</directory>
						<filtering>true</filtering>
					</resource>
				</resources>
			</configuration>
		</execution>
	</executions>
</plugin>

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-assembly-plugin</artifactId>
	<version>2.5.5</version>
	<configuration>
		<descriptors>
			<descriptor>src/main/assembly/windows.xml</descriptor>
		</descriptors>
	</configuration>
	<executions>
		<execution>
			<id>assembly</id>
			<phase>package</phase>
			<goals>
				<goal>single</goal>
			</goals>
		</execution>
	</executions>
</plugin>

Le plugin dependency est utilisé pour copier l’exécutable de winsw dans le répertoire de construction du livrable.

Le plugin resources est utilisé pour copier le fichier de configuration de service.exe et le fichier de configuration de lancement du service.

Le plugin assembly est utilisé pour créer un fichier zip contenant les dépendances du projet, un dossier pour les logs, le fichier de configuration de service.exe, le fichier de configuration du service et l’exécutable winsw. Voici la configuration du plugin assembly :

<?xml version="1.0"?>
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
		  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
	<id>windows</id>

	<formats>
		<format>zip</format>
	</formats>

	<dependencySets>
		<dependencySet>
			<useProjectArtifact>true</useProjectArtifact>
			<outputDirectory>lib</outputDirectory>
			<excludes>
				<exclude>org.springframework.boot:spring-boot-devtools</exclude>
			</excludes>
		</dependencySet>
	</dependencySets>

	<!-- Workaround to create logs directory -->
	<fileSets>
		<fileSet>
			<directory>${dist.dir}</directory>
			<outputDirectory>logs</outputDirectory>
			<excludes>
				<exclude>*/**</exclude>
			</excludes>
		</fileSet>
	</fileSets>

	<files>
		<file>
			<source>${dist.dir}/service.exe</source>
			<outputDirectory/>
			<destName>${dist.project.id}.exe</destName>
		</file>
		<file>
			<source>${dist.dir}/service.xml</source>
			<outputDirectory/>
			<destName>${dist.project.id}.xml</destName>
		</file>
		<file>
			<source>${dist.dir}/service.exe.config</source>
			<outputDirectory/>
			<destName>${dist.project.id}.exe.config</destName>
		</file>

	</files>
</assembly>

Compilation et installation

Enfin il faut construire l'application (mvn install) afin de retrouver le fichier zip dans le répertoire target. Le fichier généré contient une version déployable de l'application.

Après avoir extrait le contenu du fichier zip dans le répertoire de votre choix, lancez une ligne de commande en administrateur dans ce répertoire puis exécutez les commandes suivantes afin d'installer le service et de vérifier son fonctionnement.

Remplacez "service" par le nom de votre artifact.

service.exe install
net start service

 

Source : https://github.com/snicoll-scratches/spring-boot-daemon

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *