# Anwendung im Netzwerk verteilen



## danielmueller1985 (18. November 2009)

Hallo zusammen,

ich habe eine Frage. Vielleicht hat jemand eine Idee oder Tip wie ich das lösen kann.
Also, ich beschäftige mich erst seit kurzem mit Java und habe bei mir im Betrieb nun ein größeres Programm geschrieben dass im Netzwerk läuft. Netzwerk heißt, auf einem Server liegt die Datenbank und die einzelnen Rechner haben die jar files. Es ist eine Desktop-Anwendung. Nun sind es bisher erst 25 Rechner die damit laufen, und nun will ich das auf weiteren 80 Rechner aufspielen. Davon melden sich nur 50 an der Domäne an und der Rest ist über ein VPN erreichbar. Verbindung ist ganz gut. 

So, im Moment liegen meine jar Dateien auf einem Netzlaufwerk und ich kann die von dort auf die Rechner kopieren. Das wird aber bei bei 105 Rechnern viel zu viel zu kopieren, jedenfalls manuell. Wenn ich also eine Neue Version erstellt habe möchte ich die auf dem Server zur Verfügung stellen und beim Programmstart soll dann das programm abfragen ob es Neuer Dateien gibt und die dann ziehen.

Hat da jemand eine Idee? Oder sowas schonmal erstellt?

Hab da bisher leider noch nie etwas mit gemacht. Da alle Rechner in einem Windows-Netzwerk liegen war meine erste Idee ich lasse die .bat Datei die Dateien beim Programmstart kopieren und dann erst starten. Finde ich aber nicht so gut.

Eine andere Idee von mir ist, ein zweites Programm dass vor dem ersten aufgerufen wird, dabei prüft das zweite die Version auf dem Server und auf dem Client, wenn die Client Version älter ist wird die vom Server kopiert und ersetzt die auf dem Client. Danach startet das Programm. 
Nur bevor ich jetzt anfange ein zweites Programm zu erstellen wollte ich hier mal fragen, vielleicht gibt es schon fertig Lösungen für solche Fälle. Ich weiß nicht ob es speziell für JAVA Programme sowas gibt, aber vielleicht hat jemand von euch eine Idee.

Würde mich über eine Antwort freuen 

MfG


----------



## vfl_freak (18. November 2009)

Moin,

wenn ich Dich richtig verstanden habe, kannst Du Dir das Kopieren der JARs komplett sparen 
Du benötigst Java WebStart!

Schau mal hier:
http://de.wikipedia.org/wiki/Java_Web_Start
http://www.java.com/de/download/faq/java_webstart.xml

Gruß
Klaus


----------



## danielmueller1985 (24. November 2009)

Hi,

danke für den Vorschlag. Hab Web-Start noch nie ausprobiert und mir das mal genau angeschaut. Sowie ich das verstehe ist das hauptsächlich für das Verteilen von Applets im Browser? Das prüft beim Aufruf ob das Programm lokal bereits verfügbar ist und wenn nicht, dann wird es neu geladen. Mein Problem ist, dass ich im Netzwerk nicht überall die Möglichkeit habe direkt auf die Dateien zuzugreifen.

Ein Teil meldet sich an einer Domäne an und hat auch Netzlaufwerke wo die Programmfile auch zur Verfügung stehen. Der andere Teil ist zwar im Netzwerk verfügbar, hat aber keine Netzlaufwerke auf den Server. Der Client hat auch keine berechtigung welche zu mappen. Ein Aufruf des Programms ist kein Problem, das läuft. 

Wenn ich Web-Start falsche verstanden habe wäre ich über eine Berichtigung dankbar . Habe das im Java Handbuch durchgelesen, aber irgendwie komm ich nicht darauf wie ich das für mich nutzen kann.

Was ich schonmal bei einer Java Anwendung gesehen habe, ist dort bezeichnet als eine Softwareverteilung die beim Aufrufen sogar anzeigt welche *.jar Datei gerade geladen wird mit Prozentbalken usw. Da merkt man auch wenn auf dem Server Neue Files vorhanden sind werden die automatisch gezogen. Das läuft aber nicht über Web-Start.

Jemand eine Idee?

Vielen Dank schonmal im Voraus 

MfG


----------



## vfl_freak (25. November 2009)

Moin,



danielmueller1985 hat gesagt.:


> Sowie ich das verstehe ist das hauptsächlich für das Verteilen von Applets im Browser? Das prüft beim Aufruf ob das Programm lokal bereits verfügbar ist und wenn nicht, dann wird es neu geladen. Mein Problem ist, dass ich im Netzwerk nicht überall die Möglichkeit habe direkt auf die Dateien zuzugreifen.
> 
> Ein Teil meldet sich an einer Domäne an und hat auch Netzlaufwerke wo die Programmfile auch zur Verfügung stehen. Der andere Teil ist zwar im Netzwerk verfügbar, hat aber keine Netzlaufwerke auf den Server. Der Client hat auch keine berechtigung welche zu mappen. Ein Aufruf des Programms ist kein Problem, das läuft.



jein 
Wie es mit Applets läuft, weiß ich nicht wirklich, da ich damit bislang nichts zu tun hatte.
Hierzu nochmal folgender Link, der Dir vlt. weiterhilft:
http://www.dpunkt.de/java/Programmieren_mit_Java/Deployment/7.html#x2381

Netzlaufwerke brauchst Du dafür definitiv nicht! Allerdings schon den (Internet-)Zugriff auf den WebServer, wo das Programm liegt!



danielmueller1985 hat gesagt.:


> Was ich schonmal bei einer Java Anwendung gesehen habe, ist dort bezeichnet als eine Softwareverteilung die beim Aufrufen sogar anzeigt welche *.jar Datei gerade geladen wird mit Prozentbalken usw. Da merkt man auch wenn auf dem Server Neue Files vorhanden sind werden die automatisch gezogen. Das läuft aber nicht über Web-Start.


Von Deiner Beschreibung her müsste das eigentlich doch WebStart gewesen sein ....  
Siehe auch den Link oben!

WebStart ist ja einer der großen Vorteile gegenüber Programmen die nur als ausführbare Datei (.exe) vorliegen, weil diese dann wirklich überall physisch installiert werden müssten, während sich die Java-Applikation ggf. eine aktuelle Version eben per WebStart von jeweiligen WebServer zieht!

Gruß
Klaus


----------



## Johannes7146 (25. November 2009)

Bin mir grad nicht sicher ob es wirklich so einfach zu lösen ist....

...aber reicht es nicht, wenn jeder User einfach eine Verknüpfung des Jars auf seinem Rechner erstellt?
Dann müsstest du nur das Jar austauschen, wenn es gerade niemand geöffnet hat.

EDIT:
Ich habe das ganze gerade mal kurz getestet.
Ich habe jar erzeugt, dass einfach die IP ausließt und ausgibt. Es gibt immer die IP von dem Rechner aus, wo die Verknüpfung liegt, nicht die des Servers. Daher denke ich, dass bei mehrmaligem start der Anwendung von Verschiedenen Rechnern über eine Verknüpfung jeder Rechner lokal seine eigene Instanz des Programmes am laufen hat.
Somit sollte das mit den Verknüpfungen funktionieren. 
Allerdings solltest du vorsichtig mit Variablen umgehen die als static gekennzeichnet sind.

Korrigiert mich bitte, wenn ich falsch liege...


```
package app;

import java.net.InetAddress;
import java.net.UnknownHostException;

import javax.swing.JOptionPane;

public class Infos {

    public static void main(String[] args) {
        InetAddress ip;
        try {
            ip = InetAddress.getLocalHost();
            JOptionPane.showMessageDialog(null, "Hostname = " + ip.getHostName() + "\n"
                    + "IP-Adresse = " + ip.getHostAddress());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

    }
}
```


----------



## danielmueller1985 (25. November 2009)

Danke für eure Antworten 



			
				vfl_freak hat gesagt.:
			
		

> jein
> Wie es mit Applets läuft, weiß ich nicht wirklich, da ich damit bislang nichts zu tun hatte.
> Hierzu nochmal folgender Link, der Dir vlt. weiterhilft:
> http://www.dpunkt.de/java/Programmie...t/7.html#x2381


habe mich jetzt mal damit beschäftigt und das ganze ausprobiert. Mein Programm wird momentan über eine Bat Datei gestartet. Bevor das Programm gestaret wird laufen da noch paar andere Sachen, z. B. wird die JAVA_HOME Variable umgelenkt, weil ein anderes Programm vorher schon einen anderen Pfad einsetzt und ich mit meinem dann einen eigenen nehme. Macht keinen Sinn, aber die JRE Versionen könnten sich irgendwann mal behindern.




			
				vfl_freak hat gesagt.:
			
		

> danielmueller1985 hat gesagt.:
> 
> 
> 
> ...


Nachdem ich nun einiges zu Web-Start gelesen habe macht das auch Sinn. Nur leider kann ich bei dem besagten Programm keine jnlp Datei finden. Und dieses Programm wird auch über eine Bat Datei gestartet. Dabei wird auch nicht der Web-Start Dialog geöffnet, oder kann man den verändern?



> aber reicht es nicht, wenn jeder User einfach eine Verknüpfung des Jars auf seinem Rechner erstellt?
> Dann müsstest du nur das Jar austauschen, wenn es gerade niemand geöffnet hat.


Die Idee ist nicht schlecht. Die Verknüpfung funktioniert aber dann nur bei den Usern mit verbundenem Netzlaufwerk. Dor kann ich auch direkt beim Anmelden an der Domäne die Dateien verteilen lassen. 
Das Programm prüft beim Starten mit der DB ab ob der Benutzername sich anmelden darf. Das müsste ja dann auch funktionieren. Hm...


----------



## vfl_freak (26. November 2009)

danielmueller1985 hat gesagt.:


> Nachdem ich nun einiges zu Web-Start gelesen habe macht das auch Sinn. Nur leider kann ich bei dem besagten Programm keine jnlp Datei finden.



Moin,

die JNLP-Datei ist eine 'einfache' XML-Datei, die Du Dir für Deine Anwendung selbst erstellen musst.

Nähere Infos findest Du bspw. hier:
http://www.dpunkt.de/java/Programmieren_mit_Java/Deployment/8.html

Gruß
Klaus


----------



## danielmueller1985 (26. November 2009)

vfl_freak hat gesagt.:


> Moin,
> 
> die JNLP-Datei ist eine 'einfache' XML-Datei, die Du Dir für Deine Anwendung selbst erstellen musst.
> 
> ...



Hey, ja das weiß ich mittlerweile auch. Meinte das oben ja nur für das Programm was ich gesehen habe welches die eigenen jar Files aktualisiert. Das funktioniert wohl auch übers Netzwerk. Und dort gibt es keine jnlp Datei die das ganze über Webstart ermöglichen würde.

Ich hab aber eine Idee.
Da ich die jar Datei über eine bat aufrufe unter Windows, lasse ich vorher ein anderes prog starten dass die aktuellen Daten dann kopiert. Wenn das dann beendet wird, läuft die bat weiter und das eigentliche Programm wird gestartet. Sind keine Aktualisierungen vorhanden läuft es so durch. 

MfG


----------



## vfl_freak (27. November 2009)

danielmueller1985 hat gesagt.:


> Hey, ja das weiß ich mittlerweile auch. Meinte das oben ja nur für das Programm was ich gesehen habe welches die eigenen jar Files aktualisiert. Das funktioniert wohl auch übers Netzwerk. Und dort gibt es keine jnlp Datei die das ganze über Webstart ermöglichen würde.
> 
> Ich hab aber eine Idee.
> Da ich die jar Datei über eine bat aufrufe unter Windows, lasse ich vorher ein anderes prog starten dass die aktuellen Daten dann kopiert. Wenn das dann beendet wird, läuft die bat weiter und das eigentliche Programm wird gestartet. Sind keine Aktualisierungen vorhanden läuft es so durch.



Moin,

ich glaube, Du hast das Prinzip von WebStart noch nicht ganz verstanden!

Die JNLP-Datei (die Du wie gesagt selbst erstellen musst - siehe Link) liegt auf dem Webserver, wo auch Dein JAR-File liegt, dass Du verteilen willst. 
Beim Herunterladen legt Java dann eine entsprechende Verknüpfung in seinem Cache an und prüft bei jedem Aufruf, ob auf dem Webserver eine neue Fassung vorliegt, die dann ggf. herunter geladen und gestartet wird. Du musst also nur das JAR-File auf dem Webserver austauschen, der Rest geschieht dann automatisch!

Hier noch mal zwei weiterführende Links zu diesem Thema:
http://www.java.com/de/download/faq/java_webstart.xml
http://www.oio.de/m/webstart/

Gruß
Klaus


----------



## danielmueller1985 (27. November 2009)

Nabend,

ja doch, ich glaub schon dass ich es verstanden habe.
Leider kann ich keinen Webserver dafür nutzen. Zum Testen ja, einen lokalen. Aber leider nicht im Netzwerk wo das Programm laufen soll.
ich hab das jetzt so gelöst, dass ich Änderungen zippe und auf dem Server in einem Ordner bereitstelle. Ein kleines anderes Programm prüft den Ordner ab und wenn eine Zip Datei dort liegt wird die auf den Client kopiert und entpackt. So kann ich immer nur die geänderte Dateien, neue Ordner usw. in die Zip Datei packen.
Da ich das Programm mit einem Batch aufrufe kann vorher das andere Programm ein evtl. Update machen und sich selbst beenden und dann startet das richtige.

Vielleicht komm ich noch dazu Webstart auszuprobieren. ... 

Gruß

Daniel


----------

