Micro-Webservices als Windows-Dienste

Ziel

Der Webservice soll als Windows-Dienst laufen und alle notwendigen Einstellungen, Bibliotheken und Programme zur Verfügung haben. Für einen Java-Webservice sind dies:

  • die JAR-Datei mit dem Webservice
  • Einstellungen zu
    • Name und Version der Applikation (application.yml)
    • Datenbankinformationen je Spring-Profil (application.yml)
    • Logging-Einstellungen (application.yml)
    • Aktives Spring-Profil (Kommondozeilenparameter, Default in application.yml)
    • Port (Kommondozeilenparameter, Default in application.yml)
  • JRE-Bibliotheken (rt.jar, resources.jar, …)
  • JRE-Programme (java.exe, jvm.dll, …)

Schritte zur Erstellung

1. Erstellen der JAR

Das Spring-Boot-Projekte wird mit dem Maven-Kommando package gebaut. Hierbei wir das passende Maven-Profil (z. B. qa) angegeben, dass in der POM genutzt wird, um die passenden Dateien in die JAR-Datei zu packen. Häufig werden hier keine Unterschiede gemacht, so dass z.B. Treiber für H2 und Oracle in der JAR enthalten sind.

2. Erzeugen der EXE

Um ein Windows-Executable zu erstellen, kann Launch4J verwendet werden. Hierzu gibt es eine Maven-Erweiterung, mit der es möglich ist, die Erzeugung der EXE-Datei in den Build-Prozess zu integrieren. Das Vorgehen wird unter launch4j-maven-plugin und hasCode.com gut erläutert. Für die Applikation konzepte-admin sieht der Eintrag in der POM wie folgt aus:

<plugin>
  <groupId>com.akathist.maven.plugins.launch4j</groupId>
  <artifactId>launch4j-maven-plugin</artifactId>
  <executions>
    <execution>
      <id>l4j-clui</id>
      <phase>package</phase>
      <goals>
        <goal>launch4j</goal>
      </goals>
      <configuration>
        <headerType>console</headerType>
        <outfile>target/${project.name}-${project.activeProfiles[0].id}.exe</outfile>
        <jar>target/${project.name}-${project.activeProfiles[0].id}.jar</jar>
        <errTitle>${project.name}</errTitle>
        <restartOnCrash>true</restartOnCrash>
        <jre>
          <path>../jre/1.8.0_40</path>
          <minVersion>1.8.0</minVersion>
          <maxVersion></maxVersion>
          <jdkPreference>preferJre</jdkPreference>
          <runtimeBits>64/32</runtimeBits>
          <initialHeapSize>128</initialHeapSize>
          <maxHeapSize>512</maxHeapSize>
          <opts>
            <opt>-Dserver.port=16102</opt>
            <opt>-Dspring.profiles.active=qa</opt>
          </opts>
        </jre>
        <versionInfo>
          <fileVersion>1.1.1.0</fileVersion>
          <txtFileVersion>1.1.1.0</txtFileVersion>
          <fileDescription>Webservice</fileDescription>
          <copyright>2015 (c) by Bernd Kursawe</copyright>
          <productVersion>1.1.1.0</productVersion>
          <txtProductVersion>1.1.1.0</txtProductVersion>
          <productName>${project.name}</productName>
          <internalName>${project.name}</internalName>
          <originalFilename>original.exe</originalFilename>
        </versionInfo>
      </configuration>
    </execution>
  </executions>
</plugin>

Hierdurch wird eine EXE erstellt, die ein JRE im übergeordneten Ordner erwartet. Durch die Angabe von opts (Options) wird der Port auf 16102 und das Spring Profile auf qa festgelegt.

3. Übertragung auf den Server

Für die Übertragung sind die folgenden 4 Schritte notwendig:

  1. Der Windows-Dienst des Webservice muss auf dem Server angehalten werden. Dies kann mit services.msc erfolgen.
  2. Die fertige EXE muss nun auf den Server in das entsprechende Verzeichnis (z. B. unter C:\develop\deploy, s.u.) übertragen werden.
    webservices
      bin
        <webservice01.jar>
        <webservice02.jar>
        logs
          <webservice01.log>
          <webservice02.log>
      jre
        <jre-version-1>
        <jre-version-2>
  3. Der Service kann wieder gestartet werden.

Wenn auf dem Server ein SSH-Server installiert ist, können diese Schritte auch automatisiert werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.