Retrotranslator - hladce z Javy 1.5 do 1.4
Řada z vás si určitě řekne, co to ten Fura vytahuje za prehistorická témata. V době, kdy se už živě diskutuje o tom, co bude v Javě 1.7, rozebírá přechod z verze 1.4 na verzi 1.5. Možná vás to překvapí, ale v našem prostředí (server web aplikace), provozujeme ještě řadu instalací na verzi 1.4 a možnosti upgradu v nedohlednu. Proto je pro nás stále aktuální udržovat / vytvářet sdílené knihovny i pro 1.4 verzi Javy. Hledali jsme a zkoušeli tedy nějakou co nejméně bolestivou cestu, jak využít možností vyšších verzí se zachováním zpětné přenositelnosti. A naším (mým :-) ) favoritem se stal Retrotranslator. Více o jeho použití se dočtete v tomto článku.
Použití
Retrotranslator umožňuje konvertovat knihovny zkompilované v Javě 1.5 a 1.6 pro běh v Javě 1.4. Konverze si poradí s generikami, anotacemi, reflexí nad anotacemi, enumy, autoboxingem, novými for-each deklaracemi, varargs, kovariantními návratovými typy, statickými importy, novými funkcemi v kolekcích a dalšími fíčurkami. Retrotranslator dokáže navíc správně zkonvertovat i použití určité omezené části Java 1.5 / 1.6 API.
Pro konverzi nepotřebujete mít k dispozici zdrojové kódy, celý převod probíhá na úrovni zkompilovaného kódu (class, jar). Úplně nejjednodušší způsob konverze je přes příkazový řádek:
java -jar retrotranslator-transformer-n.n.n.jar -srcjar stripes-1.4.3.jar -destjar stripes-1.4.3-jdk14.jar
Vyrobený jar již je možné vložit na classpath aplikace běžící pod Javou 1.4. K tomuto jaru (popř. více takto zkonvertovaným jarům) je nutné na classpath dostat ještě retrotranslator-runtime-n.n.n.jar, který obsahuje pomocné třídy, které zastupují funkcionalitu vyšší verze Javy.
Při použití maven pro buildování vám bude stačit snippet:
<dependency>
<groupId>net.sf.retrotranslator</groupId>
<artifactId>retrotranslator-runtime</artifactId>
<version>1.2.1</version>
</dependency>
Také je možné potřebné classy (tzn. ty co jsou součástí balíku retrotranslator-runtime) zakompilovat přímo do konvertované knihovny do vámi určené package (k tomu slouží parametr -embed
Podpora
Výhodu retrotranslatoru vidím v dalších doprovodných nástrojích. Jednak existuje plugin do IntelliJ Idea, avšak důležité je hlavně jednoduché použití v buildovacích nástrojích jako je Ant nebo Maven.
V našem případě je integrace do buildovacího procesu směšně jednoduchá a zajistí ji následující snippet:
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>retrotranslator-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>translate-project</goal>
</goals>
<configuration>
<attach>true</attach>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
Bohužel plugin v současné verzi ještě neumí includovat runtime classy do výsledného artefaktu. V dokumentaci je sice deklarováno, že by to plugin měl umět, ale po krátkém průzkumu Groovy kódu pluginu jsem došel k závěru, že realita je jiná. Doufejme, že při vydání stabilní verze už tato funkce bude doplněna.
Parametr attach = true zajistí, že se retranslated jar dostane spolu s původním jarem do remotní repository.
Zkušenosti
Dosavadní zkušenosti s Retrotranslatorem máme dobré. S jeho pomocí jsme převedli více jak desítku externích knihoven (SubEthaMail kupříkladu) a také udržujeme JDK 1.4 verze několika vlastních knihoven a zatím jsme nenarazili na žádný problém (všechny testy svítí zelenou ;-) ). Doporučení Retrotranslatoru také najdete v dokumentaci Stripes Frameworku, který je také JDK 1.5 only.
Pokud máte nějaké zkušenosti vy - budu rád, když se o ně podělíte v komentářích.
Zdroje
- Homepage Retrotranslatoru
- Retrotranslator Maven Plugin - dokumentace a použití
- Blognutí o retrotranslatoru na www.onjava.com