2012-06-06 7 views
8

Ich habe ein Maven-Modul, das ich im J2ME-Client und im EJB-Server verwenden muss. Im Client muss ich es für Ziel 1.1 und im Server für Ziel 1.6 kompilieren.So konfigurieren Sie Maven, um zwei Versionen eines Artefakts zu erstellen, jedes für ein anderes Ziel JRE

Ich muss auch die Version 1.6 in einem Nexus-Repository bereitstellen, damit die Mitglieder, die an dem Serverprojekt arbeiten, diese Abhängigkeit enthalten können, ohne den Quellcode herunterladen zu müssen.

Ich habe unter http://java.dzone.com/articles/maven-profile-best-practices gelesen, dass die Verwendung von Profilen ist nicht der beste Weg, dies zu tun, aber der Autor hat nicht gesagt, was der beste Weg ist.

Hier ist meine pom.xml:

<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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <artifactId>proj-parent</artifactId> 
     <groupId>br.com.comp.proj</groupId> 
     <version>0.0.4-SNAPSHOT</version> 
    </parent> 

    <artifactId>proj-cryptolib</artifactId> 
    <name>proj - Cryto Lib</name> 

    <dependencies> 
     <dependency> 
      <groupId>br.com.comp</groupId> 
      <artifactId>comp-proj-mobile-messages</artifactId> 
      <version>0.0.2-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 

    <build> 

     <plugins> 

      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.3</source> 
        <target>1.1</target> 
        <fork>true</fork> 
       </configuration> 
      </plugin> 

     </plugins> 

    </build> 

</project> 
+0

Warum benötigen Sie Ziel 1.6 für den Server? –

+0

@PhilippeMarschall: Ich weiß es nicht. Ich arbeite an dem Client, die anderen Mitglieder, die auf dem Server arbeiten, sagten, dass sie es wirklich brauchen. –

+0

Das macht keinen Sinn. Code, der mit Target 1.1 kompiliert wurde, funktioniert in einer Java 6-VM einwandfrei. –

Antwort

5

Sie dies über das Plugin Maven Compiler konfigurieren.

Werfen Sie einen Blick auf die Maven compiler plugin documentation.

Sie können dies beispielsweise über verschiedene Profile aktivieren.

Wenn Sie nur unterschiedliche Zielversionen haben möchten, können Sie einfach ein variables Ziel verwenden. Etwas wie folgt aus:

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.3.2</version> 
    <configuration> 
     <source>1.3</source> 
     <target>${TARGET_VERSION}</target> 
     <fork>true</fork> 
    </configuration> 
</plugin> 
+0

Wenn ich das verstanden habe, kann ich zwei verschiedene Versionen von javac benutzen. Das ist nicht was für ein Wunsch. Ich möchte, dass dieses Modul mit Ziel 1 kompiliert wird.1, wenn es im Client-Projekt verwendet wird und mit Ziel 1.6, wenn es im Serverprojekt verwendet wird. Wir haben versucht, dies mit Profilen zu tun, aber ich habe gelesen, dass die Verwendung von Profilen zum Erstellen von zwei verschiedenen Artefakten keine gute Übung ist. –

+0

Ja das ist richtig, Sie würden zwei verschiedene Javac-Versionen verwenden. Meine Antwort wurde aktualisiert. Nicht sicher, warum die Verwendung von Profilen eine schlechte Übung wäre? – wjans

+3

Sie können hinzufügen, dass Sie Klassifikatoren verwenden müssen, um alternative Namen für Ihr gepacktes Archiv/Lieferumfang anzugeben, wenn Sie beide gleichzeitig erstellen möchten. – haylem

1

zu meinem Kommentar zu wjans' Antwort zu ergänzen, wie Sie mehr Informationen zu erhalten.

Nachfolgend würde der Compiler-Plugin haben zweimal ausgeführt durch, um zwei verschiedene Sätze von Klassendateien, identifiziert, was ein classifier (im Grunde genannt wird, ein Marker für Maven wissen, was Sie ein einzelnes Projekt beziehen, wenn sie produzieren kann mehrere Artefakte).

Grob gesagt, so etwas wie:

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.5</version> 
    <executions> 
     <execution> 
     <configuration> 
      <source>1.3</source> 
      <target>1.5</target> 
      <fork>true</fork> 
      <classifier>jdk5</classifier> 
     </configuration> 
     </execution> 
     <execution> 
     <configuration> 
      <source>1.3</source> 
      <target>1.6</target> 
      <fork>true</fork> 
      <classifier>jdk6</classifier> 
     </configuration> 
     </execution> 
    </executions> 
</plugin> 

Beachten Sie, dass die Menschen die Stirn runzeln manchmal classifier s über die Verwendung, wie sie profiles zur Verwendung, da sie möglicherweise, dass Ihr Projekt sollte in mehreren Projekten scinded werden kann bedeuten, oder dass Sie Beschädigung der Portabilität Ihres Builds.

3

Wie Haylem vorschlägt, müssen Sie es in zwei Schritten tun, einen für die Kompilierung und einen für die Gläser.

Für den Compiler

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.5</version> 
    <executions> 
     <execution> 
     <configuration> 
      <source>1.3</source> 
      <target>1.5</target> 
      <fork>true</fork> 
      <outputDirectory>${project.build.outputDirectory}_jdk5</outputDirectory> 
     </configuration> 
     </execution> 
     <execution> 
     <configuration> 
      <source>1.3</source> 
      <target>1.6</target> 
      <fork>true</fork> 
      <outputDirectory>${project.build.outputDirectory}_jdk6</outputDirectory> 
     </configuration> 
     </execution> 
    </executions> 
</plugin> 

Und dann für die Glas-Plugin

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.3.1</version> 
     <executions> 
      <execution> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      <configuration> 
       <classesDirectory>${project.build.outputDirectory}_jdk5</classesDirectory> 
       <classifier>jdk5</classifier> 
      </configuration> 
      </execution> 
      <execution> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      <configuration> 
       <classesDirectory>${project.build.outputDirectory}_jdk6</classesDirectory> 
       <classifier>jdk6</classifier> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 

Sie können dann auf das gewünschte Glas beziehen, die durch das Hinzufügen eines <classifier> Elements zu Ihrer Abhängigkeit. z.B.

<dependency> 
    <groupId>br.com.comp.proj</groupId> 
    <artifactId>proj-cryptolib</artifactId> 
    <version>0.0.4-SNAPSHOT</version> 
    <classifier>jdk5</classifier> 
</dependency> 
+0

Große Antwort! Das einzige, das die Frage IMHO richtig beantwortet. –