poniedziałek, 28 kwietnia 2008

Przygotowanie aplikacji dystrybuowanej poprzez Java Webstart

Technologia Webstart pozwala uruchamianie aplikacji desktopowych Java poprzez przeglądarkę. Użytkownik pobiera plik deskryptora aplikacji JNLP, który zawiera opis wszystkich niezbędnych do pobrania bibliotek oraz klasy uruchomieniowej. Moduł webstart będący częścią pakietu JRE odczytuje plik JNLP i pobiera najnowszą wersję wskazanych bibliotek (o ile się zmieniły) oraz uruchamia aplikację.
Przygotowanie wersji webstart naszej aplikacji wymaga utworzenia pliku JNLP, przygotowania i podpisania bibliotek jar oraz umieszczenia wszystkiego na serwerze tak aby całość była dostępna poprzez protokół http.
W automatyzacji tego procesu może pomóc nam wtyczka do Maven2 o nazwie webstart-maven-plugin.

Będziemy potrzebowali:
- pliku z kluczem (możemy go wygenerować za pomocą keygen)
- szablonu pliku JNLP:


<?xml version="1.0" encoding="utf-8"?>
<jnlp
spec="1.0+"
codebase="http://localhost:8080/webstart/"
href="$outputFile">
<information>
<title>Moja aplikacja 123</title>
<vendor>3e software house <vendor/>
<homepage>http://3e.pl<homepage/>
<description kind="one-line"> </description>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.4+"
initial-heap-size="32m"
max-heap-size="128m"
/>
$dependencies
</resources>
<application-desc main-class="$mainClass">
<argument>1</argument>
<argument>2</argument>
</application-desc>
</jnlp>


Do pliku pom.xml dodajemy opis nowej wtyczki:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>webstart-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>jnlp</goal>
</goals>
</execution>
</executions>
<configuration>

<dependencies>
<excludes>
<exclude>commons-lang:commons-lang</exclude>
</excludes>
</dependencies>

<jnlp>
<inputTemplate>src/main/jnlp/template.vm</inputTemplate>
<outputFile>test.jnlp</outputFile>
<mainClass>com._3e.TestWebStart.MainWindow</mainClass>
</jnlp>

<sign>
<keystore>${project.basedir}/keystore/naszklucz</keystore>
<keypass>KODKLUCZA</keypass>
<storepass>KODPRZECHOWANIA</storepass>
<!--sigfile>m2m2m2</sigfile-->
<alias>AliasPlikuKlucza </alias>
<validity>180</validity>

<dnameCn>www.example.com</dnameCn>
<dnameOu>None</dnameOu>
<dnameO>ExampleOrg</dnameO>
<dnameL>Seattle</dnameL>
<dnameSt>Washington</dnameSt>
<dnameC>US</dnameC>

<verify>true</verify>
</sign>

<verbose>false</verbose>
</configuration>
</plugin>


Następnie uruchamiamy:
mvn install webstart:jnlp 



Możliwe problemy:
Wszystko się zbudowało bez błędu, ale podczas uruchamiania pojawia się błąd:
JAR resources in JNLP file are not signed by the same certificate

Rozwiązanie:
Prawdopodobnie któraś z załączanych bibliotek była wcześniej podpisana. Niestety w takiej sytuacji maven nie zgłasza błedu.
Można jednak łatwo sprawdzić czy taka sytuacja nie miała miejsca analizując wyświetlane komunikaty podczas budowania - wtyczka webstart-maven-plugin wyświetli dla niej:
XYZ.jar is already signed. Skipping.

W takiej sytuacji musimy usunąć podpis z takiej biblioteki i ponownie zbudować projekt.

Referencje:
http://java.sun.com/docs/books/tutorial/jar/sign/signing.html
http://forum.java.sun.com/thread.jspa?threadID=704775&messageID=4086848

2 komentarze:

Maciej Liżewski pisze...

Aby Maven automatycznie usuwał podpisy w bibliotekach wchodzacych w sklad webstart i podpisywal wszystko naszym certyfikatem, nalezy dopisac

<unsign>true</unsign>

w konfiguracji (wewnątrz tagu <configuration>) pluginu webstart-maven-plugin.

Źródło: http://fisheye.codehaus.org/browse/mojo/trunk/mojo/webstart-maven-plugin/plugin/src/site/apt/jnlp-mojos-overview.apt?r=5983&%40annotateMode=blame

Mhaduk pisze...

Hej, mam problem z zapakowaniem jnlp w wara (tak, żeby webstart dociągał tylko różnice). Wiem że się da to zrobić ręcznie, ale czy te wtyczki do mavena to umieją?
Nie wspomnę o dokumentacji do nich bo to woła o pomstę do nieba.

Pozdr,
Daniel