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

Alternativy