Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Verwendung von Java2 5.0 Klassen mit Java2 1.4 mit Retrotranslator

In einem exis­tie­ren­den Java2 1.4 Projekt sol­len gene­rierte XFire-Clientklassen ver­wen­det wer­den. Der XFire-Codegenerator ver­wen­det JAXB2 und ist damit auf einige Java2 5.0‑Features wie Annotations ange­wie­sen. Der Umstieg auf Java2 5.0 ist in dem Projekt keine Option und des­halb habe ich eine Möglichkeit gebraucht, die gene­rier­ten Klassen mit Java2 1.4 zu ver­wen­den.

Nach ein paar Recherchen habe ich mich für die Verwendung des freien Retrotranslator-Tools ent­schie­den und eine Proof-Of-Concept-Implementierung rea­li­siert. Retrotranslator kann sowohl zur Compile-Zeit als auch zur Laufzeit den Java2 5.0 Bytecode in Java2 1.4 Bytecode umwan­deln. Für den eige­nen Code habe ich mich für die Umwandlung zur Compilezeit ent­schie­den und für ver­wen­de­ten Code Dritter für die Umwandlung zur Laufzeit (Just in Time Compilierung).

Nun zur prak­ti­schen Umsetzung mit Maven2:

Das POM des Codegenerierungsprojektes sieht fol­gen­der­ma­ßen aus:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.communardo.techblog</groupId>
  <artifactId>demoxfiregen</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Generierter XFire-Code fuer Communardo Techblog</name>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>xfire-maven-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <executions>
          <execution>
            <goals>
              <goal>wsgen</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <package>
            de.communardo.techblog.services
          </package>
          <profile />
          <binding />
          <outputDirectory>
            ${project.build.directory}/generated-sources/xfire
          </outputDirectory>
          <wsdls>
            <wsdl>
              ${basedir}/src/main/resources/TechblogDemoService.wsdl
            </wsdl>
          </wsdls>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>retrotranslator-maven-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>translate-project</goal>
            </goals>
            <configuration>
              <classifier>jdk14</classifier>
              <attach>true</attach>
              <embed>net.sf.retrotranslator</embed>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>org.codehaus.xfire</groupId>
      <artifactId>xfire-jaxb2</artifactId>
      <version>1.2.5</version>
    </dependency>
  </dependencies>
</project>

Der erste Plugin-Aufruf setzt die Java-Version auf 1.5, der Zweite gene­riert den Java-Code aus einer WSDL und der dritte gene­riert in der package-Phase von Maven ein Java2 1.4 kom­pa­ti­bles JAR-Archiv mit dem Classifier jdk14. Mit

mvn install

wird alles gebaut und ins lokale Maven-Repository instal­liert.

Im Java2 1.4‑Projekt wird das gene­rierte JAR in den Dependencies so refe­ren­ziert:

    <dependency>
      <groupId>de.communardo.techblog</groupId>
      <artifactId>demoxfiregen</artifactId>
      <version>1.0-SNAPSHOT</version>
      <classifier>jdk14</classifier>
    </dependency>

Um alle Abhängigkeiten, die von XFire und den JAXB2-Klassen benö­tigt wer­den zu erfül­len und den Retrotranslator Just-In-Time-Compiler (JIT) vefüg­bar zu machen, wur­den noch fol­gende Dependencies in das Ziel-POM ein­ge­tra­gen:

    <dependency>
      <groupId>net.sf.retrotranslator</groupId>
      <artifactId>retrotranslator-transformer</artifactId>
      <version>1.2.1</version>
    </dependency>
    <dependency>
      <groupId>javax.xml.parsers</groupId>
      <artifactId>jaxp-api</artifactId>
      <version>1.4</version>
    </dependency>
    <dependency>
      <groupId>com.sun.org.apache</groupId>
      <artifactId>jaxp-ri</artifactId>
      <version>1.4</version>
    </dependency>
    <dependency>
      <groupId>xerces</groupId>
      <artifactId>xercesImpl</artifactId>
      <version>2.8.1</version>
    </dependency>

Damit das Ganze dann zur Laufzeit funk­tio­niert muss beim Start der Applikation der Retrotranslator JIT genutzt wer­den, das geschieht in dem man die JVM-Kommandozeile fol­gen­der­ma­ßen auf­baut:

java <JVM-Parameter> net.sf.retrotranslator.transformer.JITRetrotranslator <Main-Klasse> <Anwendungsparameter>

Related Posts

Pin It on Pinterest