# Java als Windows Dienst



## PimpEE (25. Okt 2018)

Hallo zusammen,

ich möchte meine Java Application als Windows Dienst laufen lassen, hierzu verwende ich Procrun. Die Installation funktioniert soweit ohne Probelme. 

Die .bat Datei sieht wie folgt aus:

Service //IS//Service_Test
--DisplayName="Service_Test"
--Install="D:\Daten\commons-daemon\amd64\Service.exe"
--Jvm="C:\Program Files\Java\jre1.8.0_171\bin\server\jvm.dll"
--StartMode=jvm
--StopMode=jvm
--Classpath="D:\Daten\Service_Test.jar"
--StartClass=Service/Service_service
--StartParams=start
--StopClass=Service/Service_service
--StopParams=stop
--Startup=auto

Ich kann den Dienst ebenfalls starten wenn ich folgenden Code verwende und die Klasse *Service_Mail_Alert_Class* auskommentiert ist. Alle 5 Sekunden schreibt mir das Programm in die logs.txt dann die Zeit.

Code(Java):

```
public class Service_service {
 
    private static final String IDENT = "Service";
 
    //args params start/stop
    private static boolean loop_stop = false;

    public static void main(String[] args) {
     
        if("start".equals(args[0])){
            start(args);
         
        }else{
            stop(args);
        }
    }
 
    private static void start(String[] args){
     
        try {
            File file = new File("D:/Daten/logs.txt");
            FileWriter writer = new FileWriter(file, true);

            //Service_Mail_Alert_Class mailAlert = new Service_Mail_Alert_Class("muster.mann@test.com");
         
            while(!loop_stop){
                String time_s = new SimpleDateFormat("HHmm").format(new Date());
             
                writer.write(time_s);
                writer.write(System.getProperty( "line.separator" ));
                 
                writer.flush();
             
                //mailAlert.sendMail("Nachricht vom Service");
                 
                Thread.sleep(5000);
            }

         writer.close();
         
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
 
    private static void stop(String[] args){
        loop_stop = true;
    }

}
```

Wenn ich die Klasse *Service_Mail_Alert_Class* jedoch wieder reinkommentiere bekomme ich ein Windows Fehler beim starten des Dienstes. Im Windows Ereignisanzeige steht dann die Nachricht: 
*Der Dienst "Service_service" wurde mit dem folgenden dienstspezifischen Fehler beendet: Unzulässige Funktion.
*
Die Klasse Service_Mail_Alert_Class sendet ein Email, oder in unserem Fa

Wenn ich die Application im Eclipse zum testen laufen lasse dann schreibt er mir ohne Probleme eine Email, aber als Dienst bekomme ich ein Fehler!

Übersehe ich hier etwas? Jemand eine Idee was man hier machen kann?


----------



## mihe7 (26. Okt 2018)

Vermutlich fehlen im Classpath benötigte Libs (z. B. Java Mail).

Nachtrag:
Bei den Klassenangaben (StartClass etc.) sollten Paketnamen mit Punkt und nicht mit Slash voneinander getrennt werden. Heißt Euer Package wirklich Service (mit großem S)? Paketnamen schreibt man in Java normalerweise klein.



PimpEE hat gesagt.:


> im Eclipse zum testen laufen lasse


Wenn Du so etwas halbwegs unter "gleichen" Bedingungen testen willst, dann nicht in der IDE sondern auf der Befehlszeile:

`"C:\Program Files\Java\jre1.8.0_171\bin\java.exe" -cp D:\Daten\Service_Test.jar Service.Service_service`


----------



## PimpEE (26. Okt 2018)

Danke für den Tipp mit dem testen! Meine Java Erfahrung hält sich in Grenzen.

Das Package heißt anders, wollte es nur einfach halten und für den Beitrag geändert! Es wirt selbstverständlich kein geschrieben.

Es lag tatsächlich an den Libs! Diese sind zwar im Projekt enthalten aber beim Export, in eine Runnable JAR file habe ich das Library handling falsch gesetzt . Anstatt "Extract required libraries into generated JAR" habe ich "Package required libraries into generated JAR.

Danke nochmals.


----------

