wtorek, 29 kwietnia 2008

dobry link: Migrating to Maven 2 (Part 1)

Dla zainteresowanych i rozważających wykorzystanie Apache Maven 2 do budowania i ogólnie zarządzania cyklem życia aplikacji, Jim Bethancourt na swym blogu publikuje dobry tekst wprowadzający do tego narzędzia :

http://java.dzone.com/news/migrating-maven-2-part-1-0
.

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