# maven webstart Programm - wie?



## dermoritz (2. Jun 2010)

Ich möchte gerne eine WebStart-Anwendung mit Maven basteln. Mit Maven selbst hab ich schon etwas Erfahrung. Mir fehlt aber im Moment noch Erfahrung bei Webanwendungen (bis auf wenige primitive Tutorialprogramme). Beides (Maven und Webapp) kombiniert habe ich noch nicht.

Mein grobe Vorstellung (bzw. da wo ich hin will) von einer Maven-WebStart-Anwendung ist die: Maven-Webstart-Plugin einbinden "mvn package" oder "mvn assembly" ausführen. war-Datei an die richtige Stelle des WebServers kopieren (WebServer neustarten oder war-Datei -"deployen), Adresse in den Browser eingen, Anwendung startet. - bin ich da zu optimistisch (ich würde mich gerne weitgehenst auf die "Konventionen" verlassen und nicht irgendwelche jlnp Dateien erstellen)?
Oder kann man Maven dazu bringen genau so eine all-in-one-war-Datei auszuspucken? (Das deployen von Nexus war genau so einfach).

Bisher hab ich mir einige Anleitungen für das Maven-WebStart-plugin angeschaut. Für mich sind die leider zu lückenhaft (z.B. http://mojo.codehaus.org/webstart/webstart-maven-plugin/examples/war_bundle_1.html): Das fängt beim prinzipiellen Aufbau der Anwendung an: Brauche ich ein extra "webstart-modul" oder kann ich das über das Eltern-Modul der Anwendung abfrühstücken? Wie sähe so ein Modul aus? - Also was muss in die pom? Und wie läuft dann der Deploy/Release-Prozess - ein war Datei gehört wahrscheinlich nicht ins "Release Repository" oder?

Edit: inzwischen hab ich ein ausführlichere Beispiel gefunden:Maven Webstart Plug-In - Maven Webstart Plugin. ist das die richtige Konfiguration für mich (ganz unten die pom):  JnlpDownloadServlet mojo plugin configuration overview?


----------



## bygones (2. Jun 2010)

Webstart hat kein war... war sind fuer Webapplikationen.

Fuer eine Webstartanwendungen reichen simple jars. bzgl maven und webstart habe ich auch keine ahnung leider.

Aber im Grunde brauchst du deine (signierten) jars, das jnlp file... das wars


----------



## dermoritz (2. Jun 2010)

das maven plugin scheint aber beides zu bieten "war-bundle" (Maven Webstart Plug-In - Example WAR Bundle 1) und jnlp (Maven Webstart Plug-In - Maven Webstart Plugin)
Genaugenommen ist mir die Variante egal. Wichtig wäre mir, dass Maven die Generierung der jnlp-Datein weitgehend übernimmt. Man findet leider keine kompletten Beispiele im Inet nur Schnipsel aus pom-Dateien. Also gibts hier jemand der dieses Maven-Plugin benutzt hat oder eventuell das hier: code_poet : New Maven Webstart Plugin ?


----------



## Guest2 (2. Jun 2010)

Moin,

vielleicht reicht es schon wen Du das entsprechende Plugin im Buildprozess einbindest. Bei mir steht etwa folgendes in der pom.xml:


```
<url>http://blub/</url>
[..]
			<plugin>
				<groupId>org.codehaus.mojo.webstart</groupId>
				<artifactId>webstart-maven-plugin</artifactId>
				<executions>
					<execution>
						<id>test</id>
						<phase>pre-integration-test</phase>
						<goals>
							<goal>jnlp-single</goal>
						</goals>
						<configuration>
							<jnlp>
								<mainClass>test.Test</mainClass>
								<outputFile>test.jnlp</outputFile>
							</jnlp>
						</configuration>
					</execution>
				</executions>
			</plugin>
[..]
```

Anschließend liegt im Target Verzeichnis ein neues Unterverzeichnis in dem alle notwendigen JARs sowie die generierte JNLP liegt (Einfach so auf den Webserver kopieren). Wenn Du kompliziertere Sachen bauen willst, kann es sein das Du ein JNLP Template anlegen musst.

Gruß,
Fancy


----------



## dermoritz (2. Jun 2010)

mhm, mit package gehts nicht, dann bekomm ich nur eine jar-datei. Also was muss ich ausführen damit er mir das jnlp leifert? und was hat es mit der ganzen "execution"-Abteilung auf sich?


----------



## maki (2. Jun 2010)

Ach Leute, warum nicht mal die Doku lesen, vor allem die Grundlagen von Maven2 sind wichtig....

Klar dass da nix passiert wenn das Plugin erst in der pre-integration-test Phase aktiv wird aber Maven2 nur bis package baut.. :noe:


----------



## dermoritz (2. Jun 2010)

wie gesagt die doku zu webstart maven plugin ist ähnlich lückenhaft. für andere plugins gibt es beispiele die funktionieren - out of the box.
also gibt es ein besipiel für eine pom datei mit minimal-konfiguration? also welche dinge werden durch konventionen erschlagen - die will ich erstmal alle gar nicht wissen. nur das was gebraucht wird damit "hello world" als webstart läuft.

oder ist obiges beispiel "minimal" und nur die "phase" ist falsch? welche ist richtig?

übrigens hab ich mit dem anderen plugin: code_poet : New Maven Webstart Plugin schon ein Paket hinbekommen. Nur meinte Java Webstart dann, dass es die Resource launch.jnlp nicht downloaden kann. Deswegen dachte ich ich probier nun mal das codehouse plug-in.


----------



## maki (2. Jun 2010)

> oder ist obiges beispiel "minimal" und nur die "phase" ist falsch? welche ist richtig?


Nun, wenn du selber die "pre-integration-test" Phase angibst, welche wird wohl die richtige sein? :autsch:

Nebenbei bemerkt, sollte man mit Multimodulprojekten mindestens immer zumindest die install Phase durchlaufen.


----------



## dermoritz (2. Jun 2010)

Das heißt keiner kann mir eine pom-Datei zeigen mit der es funktioniert? Nur Codeschnipsel bei denen man nicht weiß welche Einstellungen durch welche Konventionen eventuell schon gedeckt sind? (Aslo analog zu den Dokus der anderen Maven Plugins oder eben code_poet : New Maven Webstart Plugin). 

Das Beispiel von Guest2 zeigt eben die "pre-integration-test" andere Beispiele "process-resources" (wirft bei package Fehler "artifact with no file: de.meineorg:webstartApp:jar:0.0.1-SNAPSHOT"). Da würde mich interesieren gibt es da keine vernünftige Konvention? (bei keinem Plugin musste ich bisher Execution angeben - die Konventionen waren immer ausreichend)

Also, das Beispiel von Guest2 produziert die genannte Meldung und als Info kommt: No resources found in pfadZurApp\src\main\jnlp\resources
Kann ich Maven dazu bewegen den Kram zu generieren?


----------



## maki (2. Jun 2010)

Dein Problem ist offensichtlich, dass du das Maven2 Build Konzept nicht verstanden hast, nur Code schippsel kopieren & einfügen reicht eben nicht.

Dir ist klar das Maven einen Buildlifecycle hat, der verschiedene Phasen beinhaltet und ja nach packaging variiert?
Ja nach Projektstruktur & POM Aufbau ist entweder "process-resources" oder "package oder "install" oder oder oder... richtig.

Wenn du jetzt die Ausführung eines Plugins an die "pre-integration-test" Phase bindest, aber nur bis "package" ausführst, darfst du dich nicht wundern dass diese Plugin nicht ausgeführt wird, das hast du selber konfiguriert.

Du wirst keine Plugin Doku finden in dem sowas im Detail erklärt wird, gehört nähmlich zu den Grundlagen von Maven2.

Sieh dir doch mal den Default Lifecycle an: Maven - Introduction to the Build Lifecycle

Wann kommt die "package" Phase, wann die "pre-integration-test" Phase?
Warum würde es funktionieren wenn du zB [c]mvn install[/c] ausführen würdest?


----------



## dermoritz (2. Jun 2010)

ok danke maki mit diesen infos kann ich was anfangen. Was spricht aber dagegen für die Phase wann ein Plugin ausgeführt wird eine gute Konvention mitzugeben - wie bei anderen Plugins. Das 2. WebStart-Plugin (siehe oben) - funktioniert wunderbar ohne eine solche Angabe.
Das Beispiel von Guest2 suggeriert, das es das einzige ist was man konfigurieren muss und der Rest durch Konventionen erledigt wird.
Also was muss man für das Codehouse Webstart-Plugin mindesten konfigurieren? Gibt es eine Konvention für die Execution phase? Wie findet oder kompiliert das Plugin die benötigte .jar -Datei. Um das mal plastische zu machen. Das andere Plugin kommt mit folgendem aus:

```
<build>
    <plugins>
      <plugin>
        <groupId>com.codecrate</groupId>
        <artifactId>webstart-maven-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>generate-jnlp</goal>
             </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>com.mysite.MyApp</mainClass>
          <allPermissions>false</allPermissions>
        </configuration>
      </plugin>
    </plugins>
  </build>
```
damit hat man jnlp und jar (die jar-Datei ist target eines ganz anderen Moduls). Nur das dieser Kram eben leider nicht funktioniert - WebStart wirft eine FailedToDownloadException ->(gekapselte Ausnahme) ConnectException: Connection refused.

Sobald ein Webstart Plugin mehr config braucht, wre es eigentlich leichter die jnlp selbst zu schreiben - die ist ja winzig.


und die richtige Struktur für ein Multi-Module-(Webstart)-Projekt hab ich wohl auch noch nicht. Sollte das webstart-plugin mit seiner Konfig in das Eltern-Modul? Oder in ein seperates? Seperat würde mir gefallen (bei dem alternativen WebStart Plugin ging das ohne Dependency) - wie kann ich in einem Modul ein Schwestermodul verwenden ohne es in Repository installieren zu müssen?


----------



## maki (2. Jun 2010)

> Was spricht aber dagegen für die Phase wann ein Plugin ausgeführt wird eine gute Konvention mitzugeben - wie bei anderen Plugins.


Die meisten Plug-ins haben eine default execution phase(dieses bestimmt auch), weil diese Plug-ins eben oft in ein & denselben Kontext verwedent werden.
Manchmal passt das leider nicht..  weil man manchmal die Sachen eben etwas anders macht.

Für sowas könnte die Install Phase passen, muss aber nicht.
Wenn ich  zB. ein WAR baue aus mehreren WebApps, dann wäre install nicht immer die richtige Phase... usw.

Manchmal zB. wäre WebStart nur eine packaging variante einer jar, damit würde ich es in ein eigenes Modul packen, damit ist die Phase nicht mehr so wichtig, als wenn alles in einer POM wäre.

Deswegen ist es wichtig zu verstehen, wie Phasen zusammenhängen 

Wenn ein Modul ein anderes als dependency hat, dann läuft das nur noch über das lokale Maven2 repo, deswegen ist die install phase das minimum bei multimodul Projekten!
[c]mvn install[/c] 
Alles andere führt zu schrägen Problemen mit MultiModulPorjkten in maven 2 IME, du würdest nicht glauben was ich alles schon gesehen habe, nur weil Leute dachten, package würde reichen in einem Multimodul Projekt.
Ist aber gewohnheitssache, wenn man zB. von Ant kommt glaubt man gerne das compile ausreicht


----------



## dermoritz (2. Jun 2010)

nun hab ich fast mehr über maven gelernt als über das (Maven)-webstart-(plugin)  -- danke maki. Ncohmal zum alternativ -Plugin: hast du eine Vorstellung wieso es ohne ein install / Dependency des schwesternprojekts auskommt?

Übrigens mit dem Teil funktioniert der Webstart nun - zumindest auf einem lokalen Tomcat. Das es auf unserem Test-Tomcat nicht läuft liegt wahrscheinlich an der Konfig (eventuell müssen die .jar-signiert werden).

Die nächste Frage wäre ob in Anbetracht dessen es sich überhaupt lohnt das "offizielle" Maven-WebStart-Plugin zu verwenden oder ob ich nicht lieber bei dem "anderen" bleiben sollte?!


----------



## maki (2. Jun 2010)

Persönlich achte ich immer das ich plug-ins nutze, die weite Verbreitung haben, das geht natürlich nicht immer.
Ansonsten nehme ich, was funktoniert 
Hab schon mehr als einmal den Quellcode für plugins studieren müssen, weil die Doku lücken hatte... du wärst überrascht wie einfach das ist 

Ich kenne mich übrigens weder mit WebStart noch mit den maven plug-ins dafür aus, kann dir da also keine konkrete Hilfestellung geben


----------



## dermoritz (7. Jul 2010)

inzwischen hab ich das "offizielle" Webstart-Plugin tatsächlich zum laufen gekriegt. Das Plugin hat die wahrscheinlich beschissenste Doku die man sich denken kann, aber man findet auf der Seite einen Link zu einer Quellcodeverwaltung mit Beispielprojekten. Anhand der pom-Dateien dort kann man erahnen was man mindestens braucht (zumindest wenn man vorher das andere enfache Plugin benutzt hat - siehe oben). Also hier mal der entsprechende Teil der POM:

```
<plugin>
				<groupId>org.codehaus.mojo.webstart</groupId>
				<artifactId>webstart-maven-plugin</artifactId>
				<version>1.0-alpha-2</version>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>jnlp</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<jnlp>
						<outputFile>launch.jnlp</outputFile>
						<mainClass>where.in.the.world.is.the.mainClas</mainClass>
					</jnlp>
					<excludeTransitive>true</excludeTransitive>
					<sign>
						<keystore>${project.basedir}/src/main/resources/keystore</keystore>
						<keypass /> 
						<storepass>pass</storepass> 
						<alias>blub</alias>
					</sign>
					<verbose>true</verbose>
				</configuration>
			</plugin>
```
Eine "Codebase" Property hab ich nicht gefunden "<codebase>" funktioniert jedenfalls nicht. Per default wird als codebase und homepage die "<url>" aus der pom genommen. Wie man einen keystore macht weiß ich nicht- den gibts bei uns schon.

Noch etwas zum Rest: bei mir ist "webstart" ein extra Modul. Und dieses Modul hat nur eine Abhängigkeit zu einem Modul - das wiederum erzeugt nur eine Assembly(jar-with-dependencies). Aus diesem Grund hab ich "<excludeTransitive>true</excludeTransitive>" drinne - damit werden nicht alle jar's von allen Abhängigkeiten (auch indirekten) mit in die zip gepackt. Aus irgendeinem Grund erzeugt das Modul selbst aber eine jar, die aber völlig sinnlos ist, aber das werd ich auch noch in den Griff kriegen.


----------



## kama (7. Jul 2010)

Hallo,



dermoritz hat gesagt.:


> inzwischen hab ich das "offizielle" Webstart-Plugin tatsächlich zum laufen gekriegt. Das Plugin hat die wahrscheinlich beschissenste Doku die man sich denken kann, aber man findet auf der Seite einen Link zu einer Quellcodeverwaltung mit Beispielprojekten. Anhand der pom-Dateien dort kann man erahnen was man mindestens braucht (zumindest wenn man vorher das andere enfache Plugin benutzt hat - siehe oben).


Also wenn die Doku so sch... ist wie Du sagst hast Du denn auch mal ein paar Issue Einträge (Maven 2.x Webstart Plugin - jira.codehaus.org) mit entsprechenden Vorschlägen gemacht wie die Doku verbessert werden kann ? 

Abgesehen davon, vielleicht habe ich ja noch etwas nicht verstanden aber was ist hiermit:
Webstart Maven Plugin - JNLP goals overview

EDIT: Abgesehen davon scheint die aktuellste Version 1.0-beta-1 zu sein und nicht 1.0-alpha-2 ..

Gruß
Karl Heinz Marbaise


----------

