# Java Applikation als Windows Service einrichten



## Shaguar (28. Jun 2011)

Hallo zusammen,

ich suche nach einer Möglichkeite eine Java Applikation auf einen Windows Server 2008 64bit als Service zu installieren.
Soweit ich informiert bin komme ich wohl nicht um eine Wrapper.exe herum die mir meine jar Datei startet.
Aber 2 Probleme hätte ich da noch, zum einen bräuchte ich dann erstmal einen Wrapper (muss Freeware sein) in 64bit, wäre natürlich noch besser wenn es komplett ohne 3rd Party Software funktionieren würde, also wenn da jemand einen kennen würde wäre das super.
Zum anderen habe ich noch das Problem das meine Java App nur über die Konsole (oder über eine Batch) mit entsprechender Parameter Übergabe gestartet werden kann.


----------



## TheDarkRose (28. Jun 2011)

SrvAny ist da ganz hilfreich, wie es hier z.b. mit Aiccu gemacht wurde. Dort kannst dann beim Parameters Registry Schlüssel einfach den vollen Pfad zu javaw und allen dazugehörigen aufrufparametern eingeben.


----------



## Shaguar (28. Jun 2011)

Ok danke erstmal, habs mal so versucht aber klappt noch nicht wirklich.
Das einrichten ging problemlos und im Registryschlüssel _Parameters_
habe ich %PathToJavaDir%/bin/java.exe -jar %PathToApp%/zgdok.jar
eingetragen, aber völlig egal was ich da eintrage auch wenns irgendeine normale exe Datei ist, kommt immer diese Fehlermeldung beim starten des Services:
(Beim Starten über den Service Manager von Win 2008)
"The ZGDOKService service on Local Computer started and then stopped. Some services stop automatically if they are not in unse by other services or programs."
und beim starten über Konsole mit net start ZGDOKService:
>net start ZGDOKService
The ZGDOKService service is starting.
The ZGDOKService service could not be started.

The service did not report an error.

More help is available by typing NET HELPMSG 3534.


----------



## TheDarkRose (28. Jun 2011)

Beendet siche deine Anwendung eh nicht von selbst?


----------



## Shaguar (28. Jun 2011)

ne die läuft normalerweise endlos weiter wenn ich sie starte.


----------



## Shaguar (29. Jun 2011)

Also ich hab das Ganze jetzt auch nochmal auf nem Windows XP System versucht, genau wie in der Anleitung beschrieben aber da kommt genau die gleiche Fehlermeldung.


----------



## Marcinek (29. Jun 2011)

Wenn deine Anwendung noch weitere Jars  benötigt, dann musst du den Classpath ebenfalls mit angeben.


----------



## Shaguar (29. Jun 2011)

ja schon klar, aber es funktioniert ja generell nicht.
Aber ich habe jetzt mal einen anderen Wrapper getestet, winserv.exe, mit dem konnte ich endlich mal einen Service installieren und auch starten, sogar mit ner .bat Datei, aber ist wohl nur oberflächlich so, weil der Service ist zwar gestartet macht aber nichts, sollte zumindest log Dateien schreiben etc...
Dann hab ich mal versucht die jar Datei die von meiner .bat Datei zzgl Parametern gestartet wird, direkt als Service laufen zu lassen, dann kommen aber wieder die gewohnten Fehlermeldungen.
Dann hab ich noch versucht mit Hilfe des winserv Wrappers die java.exe mit -jar %jarFile% als Service einzurichten aber das klappte leider auch nicht.
Also am Besten sah es bisher noch bei der .bat Datei aus, die wurde sogar als Service gestartet, aber mehr auch nicht, es sei denn das die log Dateien (welche laut .bat Datei: "java -DlogDir=../log/ -cp %cp% -jar zgd.jar" so angelegt werden) in einem ganz anderen Ordner angelegt werden und der Service dann doch richtig läuft und ich nur die korrekten log Dateien nicht finden kann.
Keine Ahnung ob -DlogDir=../log/ noch relativ zu batch Datei, die ich angegeben habe, angelegt wird oder sonst wo.


----------



## Marcinek (29. Jun 2011)

Ja und wieso klappt es nicht?

Dein programm startet möchte Log4J initialisieren und BUM CLASS NOT FOUND.


----------



## Shaguar (29. Jun 2011)

Wie würde ich denn prinzipiell den Classpath hier anpassen?
Ich lege erstmal den Service ansich an, mit instsrv.exe blaServiceName "c:\srvany.exe"
und dann im entsprechenden Registry Schlüssel füge ich den Unterschlüssel Parameters an der den Pfad zu meiner jar Datei enthält, ich nehme an dort kann ich noch was hinten anfügen um meine .jar Datei parameter zu übergeben aber wie mache ich das mit dem Classpath, das is ja eig ein java.exe Parameter?


----------



## Marcinek (29. Jun 2011)

Genau

siehe dazu die Doku der Wrapper.

Ich benutze srvany


----------



## Shaguar (29. Jun 2011)

In der Doku die ich zu srvany.exe gefunden habe steht nur drin wie man der application parameter hinzufügt, das bedeuted ich muss dann als application erstmal die java.exe angeben und als "AppParameter" dann -jar %meineApp% ? Es steht auch leider nur der Gebrauch von einem AppParameter drin, aber nicht was zu tun ist bei mehreren Parametern.


----------



## Marcinek (29. Jun 2011)

Ich glaube man kann die dann durchnumerieren und er fügt sie aneinander.


----------



## TheDarkRose (29. Jun 2011)

Kannst du nicht einfach alles im Parameters Schlüssel eingeben, wie wenn du es von der kommandozeile aufrufst?


----------



## Shaguar (29. Jun 2011)

Aber mit der srvany.exe bekomme ich leider nach wie vor absolut gar nichts zum laufen.
Habe mal versucht c:\\Windows\\system32\\cmd.exe/k als Service zum laufen zum bringen, genau wie in der Doku beschrieben (Problembehandlung bei SrvAny mit cmd.exe) aber das läuft einfach nicht.
Immer die gleiche Fehlermeldung wie oben.


----------



## Shaguar (29. Jun 2011)

Also hab nochmal eins ganz simples Java programm geschrieben das nichts weiter macht als alle 5 sekunden die Uhrzeit auszugeben.
Als runnable Jar exportiert nach C:\ gelegt und dann versucht das Programm irgendwie als Service zu installieren, mit allen möglichen Wrappern etc aber nichts ging.
zB mit >instsrv.exe ServiceName "C:\srvany.exe"
und dann wieder den Schlüssel Parameters mit dem Wert C:\myApp.jar eingefügt.
Dann die winsrv.exe probiert, die RunAsSvc.exe etc pp... dann hab ich alles nochmal mit der java.exe -jar c:\myApp.jar probiert, aber nichts von all dem hat funktioniert.... :-(


----------



## TheDarkRose (29. Jun 2011)

Im  Parameters von srvany muss schon alles stehen.
[c]C:\pfad\zu\java\bin\java.exe -jar C:\dein.jar[/c]


----------



## Shaguar (29. Jun 2011)

Das hab ich ja schon auch so versucht...


----------



## TheDarkRose (29. Jun 2011)

Wenn du das so auf der kommandozeile eingibst funktionierts aber, odeR?


----------



## andiv (29. Jun 2011)

Hast du schon den Java Service Launcher (JSL Free Java NT Service Launcher for Windows/NT/W2K/Win 2003) oder den Java Service Wrapper (Java Service Wrapper - Download Java Service Wrapper) ausprobiert? Zumindest mit ersterem hab ich schon gute Erfahrungen gemacht.


----------



## Shaguar (30. Jun 2011)

Also den Java Service Wrapper hatte ich schon probiert, aber jetzt hab ich mal eben den Java Service Launcher getestet mit komischen Ergebnis. Ich bin mir zum einen immer noch nicht sicher was alles in dieser jsl.ini Datei stehen muss, was dort wichtig ist und was weggelassen werden kann. Hab da mal ein wenig rumgespielt und versucht es mit verschiedenen Konfigurationen zum Laufen zu bringen. Aber wenn ich den Service dann installiert und versuche zu starten dann rödelt der nur Ewigkeiten rum bis dann die Fehlermeldung kommt "...der Dienst antwortet nicht. ..." aber wenn ich mal von der Konsole aus "jsl.exe -debug" starte dann funktioniert es! der Debug modus startet meine test.jar und sie läuft plötzlich korrekt und erzeugt die Test-Ausgaben wie gewollt.




> Wenn du das so auf der kommandozeile eingibst funktionierts aber, odeR?


Ja tut es.


----------



## Shaguar (4. Jul 2011)

Also kann mir denn jemand irgendeine Konfiguration geben mit einer Bsp Jar, die bei ihm schon mal funktioniert hat?

Also habe gerade nochmal eine weitere Anleitung gefunden :
(Tom Henne: JavaProgrammeAlsWindowsServiceStarten)
alles gemacht wie beschrieben wurde, Service wurde erfolgreich eingerichtet und ließ sich sogar starten aber leider hat der Service nicht das getan was er tun sollte, nämlich alle paar Sekunden Log Dateien ins Verzeichnis schreiben. Liegt das am Service das der keine Dateien erstellen darf oder wurde meine App doch nicht richtig gestartet, sondern vielleicht nur die JVM?

Wie gesagt, hab alles so gemacht wie in der Anleitung oben:
Der Registry Schlüssel:
REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceTestService\Parameters]
"Application"="\"C:\\Program Files\\java\\jdk1.6.0_25\\bin\\java.exe\" -cp C:\\Service\\ghzzu.jar ServiceTest.Main"
"AppDirectory"="\"C:\\Service\""

alternativ hab ich statt (-cp C:\\..... Klasse.Main) dann auch mal ...java.exe -jar C:\\Service\\ghzzu.jar  versucht aber auch ohne Resultat.


----------



## Shaguar (4. Jul 2011)

Ok, Kommando zurück, jetzt läuft alles 
Habe nicht daran gedacht das die log Files im Windows/system32 Ordner hinterlegt werden wenn man keinen Pfad mit angibt, deswegen habe ich sie nicht gefunden.
Aber es hat jetzt alles prima funktioniert zum ersten Mal.


----------



## Java_is_Fun (23. Okt 2013)

Shaguar hat gesagt.:


> Ok, Kommando zurück, jetzt läuft alles
> Habe nicht daran gedacht das die log Files im Windows/system32 Ordner hinterlegt werden wenn man keinen Pfad mit angibt, deswegen habe ich sie nicht gefunden.



Genau das gleiche Problem habe ich auch gerade.
Wie kann ich die Logfiles in das Verzeichnis schreiben lassen, in dem die Anwendung liegt, *ohne dabei einen absoluten Pfad anzugeben?*
Mein Versuch es über "System.getProperty("user.dir")" zu lösen schlug leider fehl.....

edit: habe es jetzt selbst hinbekommen und zwar mit folgender Lösung:
Mein relativer Pfad ist mit "/" angegeben und  "System.getProperty("user.dir")" gibt die Struktur mit "\" aus. Ich hatte vorher versucht mit String.replace entweder die eine oder die andere variante zu nutzen, was beides nicht ging. Nun habe ich folgenden String und es geht :bloed: :
 [main] DEBUG org.apache.commons.configuration.ConfigurationUtils  - Loading configuration from the absolute path C:*\*Users*\*Mein Name.MYDOMAIN*\*Documents*\*NetBeansProjects*\*Programmname*\*var*/*etc*/*config.xml

edit2:
aaaarg, wenn ich den Dienst starte gibt er mir wieder "C:\Windows\System32" zurück!

letztes edit :lol: :
ich lese den Pfad nun über args[0] ein und übergebe den Pfad nun in der Registrierung.
Schön ist es nicht, aber mir fällt kein weg ein, wie das Anwendung in der JavaBox herausfinden kann, aus welchen Verzeichnis sie ursprünglich geladen wurde


----------

