2012-06-06 5 views
8

Mam moduł maven, który muszę użyć w kliencie J2ME i serwerze EJB. W kliencie muszę skompilować go dla celu 1.1 i na serwerze dla celu 1.6.Jak skonfigurować Mavena do budowania dwóch wersji artefaktu, każdy dla innego celu JRE

Muszę również wdrożyć wersję 1.6 do repozytorium Nexusa, aby członkowie pracujący nad projektem serwera mogli uwzględnić tę zależność bez konieczności pobierania kodu źródłowego.

Przeczytałem na http://java.dzone.com/articles/maven-profile-best-practices, że używanie profili nie jest najlepszym sposobem na zrobienie tego, ale autor nie powiedział, jaki jest najlepszy sposób.

Oto moja 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

Dlaczego potrzebujesz celu 1.6 dla serwera? –

+0

@PhilippeMarschall: Nie wiem. Pracuję nad klientem, inni członkowie, którzy pracują na serwerze, mówią, że naprawdę tego potrzebują. –

+0

To naprawdę nie ma sensu. Kod skompilowany z celem 1.1 działa dobrze w maszynie wirtualnej Java 6. –

Odpowiedz

5

Można skonfigurować to za pośrednictwem wtyczki kompilatora Maven.

Spójrz na Maven compiler plugin documentation.

Można to włączyć za pomocą różnych profili, na przykład.

Jeśli chcesz mieć tylko różne wersje docelowe, możesz po prostu użyć zmiennej docelowej. Coś takiego:

<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

Jeśli zrozumiałam, używając tego, będę mógł używać dwóch różnych wersji javac. To nie jest to, czego chcą. Chcę, aby ten moduł był kompilowany z celem 1.1, gdy jest używany w projekcie klienta oraz z celem 1.6, gdy jest używany w projekcie serwera. Próbowaliśmy to zrobić z profilami, ale czytałem, że używanie profili do budowania dwóch różnych artefaktów nie jest dobrą praktyką. –

+0

Tak, to prawda, używałbyś dwóch różnych wersji javac. Zaktualizowałem moją odpowiedź. Nie wiesz, dlaczego używanie profili byłoby złą praktyką? – wjans

+3

Możesz dodać, że musisz używać klasyfikatorów do określania nazw alternatywnych do spakowanego archiwum/produktu, jeśli chcesz budować obie naraz. – haylem

1

Aby uzupełnić mój komentarz do odpowiedzi wjans', jak o więcej szczegółów.

Poniższa musiałby plugin kompilator wykonany dwukrotnie produkować dwa różne zestawy classfiles, zidentyfikowane przez co nazywa się classifier (zasadniczo, marker Maven wiedzieć, czego dotyczą, gdy pojedynczy projekt może produkować wiele artefaktów).

grubsza coś takiego:

<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> 

pamiętać, że ludzie czasami boczyć na wykorzystaniu classifier s, ponieważ na wykorzystaniu profiles, ponieważ mogą one być może oznaczać, że projekt powinien być scinded w wielu projektach lub że jesteś szkodząc przenośności twojej kompilacji.

3

Haylem sugeruje, że musisz zrobić to w dwóch etapach: jeden do kompilacji i drugi do słoików.

dla kompilatora

<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> 

a następnie przez wtyczkę słoik

<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> 

można następnie odwołać się do wymaganego słoika dodając element <classifier> do uzależnienia. na przykład

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

Świetna odpowiedź! Jedyny, który poprawnie odpowiada na pytanie IMHO. –